sci*_*ctn 9 gcc cygwin compiler-errors gmp
我正在尝试在Cygwin上编译这个简单的GMP程序:
#include <gmp.h>
int main(){
mpz_t i;
mpz_init(i);
}
Run Code Online (Sandbox Code Playgroud)
这是命令:
gcc -lgmp test.c
我收到此错误:
/tmp/ccJpGa7K.o:test.c:(.text+0x17): undefined reference to `__imp___gmpz_init'
/tmp/ccJpGa7K.o:test.c:(.text+0x17): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `__imp___gmpz_init'
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
知道什么是错的吗?我知道它可以找到库(libgmp.dll.a),但似乎没有找到该函数.
产量nm /usr/lib/libgmp.dll.a | grep mpz_init:
0000000000000000 T __gmpz_inits
0000000000000000 I __imp___gmpz_inits
0000000000000000 T __gmpz_init_set_ui
0000000000000000 I __imp___gmpz_init_set_ui
0000000000000000 T __gmpz_init_set_str
0000000000000000 I __imp___gmpz_init_set_str
0000000000000000 T __gmpz_init_set_si
0000000000000000 I __imp___gmpz_init_set_si
0000000000000000 T __gmpz_init_set_d
0000000000000000 I __imp___gmpz_init_set_d
0000000000000000 T __gmpz_init_set
0000000000000000 I __imp___gmpz_init_set
0000000000000000 T __gmpz_init2
0000000000000000 I __imp___gmpz_init2
0000000000000000 T __gmpz_init
0000000000000000 I __imp___gmpz_init
Run Code Online (Sandbox Code Playgroud)
我尝试了没有grep,并且由于某种原因,其中的每个符号都有地址0.
sci*_*ctn 16
这修好了:gcc test.c -lgmp.我把它放在-lgmp最后.这似乎是Cygwin特有的东西,我在OS X上用Clang和gcc-4.9进行了尝试,他们并不关心顺序.
至于dll.a文件的奇怪行为,这是因为一些*.a文件只是导致链接到实际的cyg*.dll的存根,这些都在/ usr/bin或/ usr/local/bin中.但是,我认为这应该是自动的,因为Cygwin试图成为POSIX,所以如果你这样做,那么你不应该引用cyg*.dll文件.
从这里找到:https: //cygwin.com/ml/cygwin/2011-12/msg00305.html