Gcc 未定义对`u imp_ugmpz_init';的引用;,在Cygwin上建立GMP计划

Gcc 未定义对`u imp_ugmpz_init';的引用;,在Cygwin上建立GMP计划,gcc,compiler-errors,cygwin,gmp,Gcc,Compiler Errors,Cygwin,Gmp,我试图在Cygwin上编译这个简单的GMP程序: #include <gmp.h> int main(){ mpz_t i; mpz_init(i); } 知道怎么了吗?我知道它可以找到库(libgmp.dll.a),但它似乎找不到函数 nm/usr/lib/libgmp.dll.a|grep mpz_init的输出: 0000000000000000 T __gmpz_inits 0000000000000000 I __imp___gmpz_inits 000

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

#include <gmp.h>

int main(){
    mpz_t i;
    mpz_init(i);
}
知道怎么了吗?我知道它可以找到库(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

这修复了它:
gcc test.c-lgmp
。我刚刚把
-lgmp
放在最后。这似乎是Cygwin所特有的,我在OSX上用Clang和gcc-4.9两个版本都试过了,但他们并不关心顺序

至于dll.a文件的奇怪行为,这是因为一些*.a文件只是存根,导致链接到实际的cyg*.dll,它们都在/usr/bin或/usr/local/bin中。然而,我认为这应该是自动的,因为Cygwin试图成为POSIX,所以如果你做得对,那么你就不必引用cyg*.dll文件

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

您是如何安装GMP的?使用nm libgmp.dll.a | grep mpz_init也可以提供一些信息。是-m32还是-m64工作得更好?我在问题中添加了nm输出-m32完全破坏了它,-m64给出了相同的结果。然而,这样做使它工作起来:
gcc test.c/usr/bin/cyggmp-10.dll
。不知道为什么。确实有很多问题需要解释为什么顺序很重要。我真的不知道,为什么例如
-lgmp
需要作为最后一个参数。有人能解释一下原因吗?这对我很有效(在Linux的Windows子系统上),但是
-lgmp
到底意味着什么?
-lgmp
意味着链接GMP库,即在Linux上,在库路径中查找类似
libgmp.a
的文件。如果调用类似于
mpz_init()
的函数,则汇编代码将位于该.a文件中,而不是程序中。链接器告诉你的程序如何找到它。
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