在Cygwin上构建GMP程序时出现“undefined reference to `__imp___gmpz_init'”错误。

17

我正在尝试在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地址,原因不明。


你是如何安装GMP的?使用“nm libgmp.dll.a|grep mpz_init”也可以提供一些信息。-m32还是-m64哪个更好? - Marc Glisse
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - sciencectn
3个回答

28
这样做可以解决问题: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

1
在SO上确实有很多关于为什么顺序很重要的问题。 - Marc Glisse
1
我真的不知道为什么例如“-lgmp”需要作为最后一个参数。有人能解释一下原因吗? - PiMathCLanguage
它在我的电脑上(Windows Subsystem for Linux)运行良好,但-lgmp到底是什么意思呢? - Denis G. Labrecque
“-lgmp” 意味着链接到 GMP 库,即在 Linux 上查找类似于“libgmp.a”的文件。如果您调用像“mpz_init()”这样的函数,则汇编代码将在该 .a 文件中而不是您的程序中。链接器告诉您的程序如何找到它。 - sciencectn

1

对于我来说,使用g++ main.c -o main -lgmp有效。基本上,我所要做的就是将-lgmp放在最后。


0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接