未定义引用`__imp___gmpz_init',在Cygwin上构建GMP程序

时间:2015-03-14 07:52:17

标签: gcc compiler-errors cygwin gmp

我正在尝试在Cygwin上编译这个简单的GMP程序:

#include <gmp.h>

int main(){
    mpz_t i;
    mpz_init(i);
}

这是命令: 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

知道什么是错的吗?我知道它可以找到库(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

我在没有grep的情况下尝试了它,并且由于某种原因,其中的每个符号都有地址0。

2 个答案:

答案 0 :(得分:13)

修正了它:gcc test.c -lgmp。我把-lgmp放在最后。这似乎是Cygwin特有的东西,我在OS X上用Clang和gcc-4.9进行了尝试,他们并不关心顺序。

至于dll.a文件的奇怪行为,这是因为某些* .a文件只是导致链接到实际cyg * .dll的存根,这些存在于/ usr / bin或/ usr / local /完事。但是,我认为这应该是自动的,因为Cygwin试图成为POSIX,所以如果你这样做,那么你不应该引用cyg * .dll文件。

从这里发现: https://cygwin.com/ml/cygwin/2011-12/msg00305.html

答案 1 :(得分:0)

在Windows 7上使用带有代码块的gmp.h时,我也遇到了同样的问题。我的解决方案 1.安装cygwin时从deval安装gmp 2.在编辑器的链接器中添加libgmp.a和libgmp.dll.a路径的路径 3.重建所有。