对“__imp___gmpz_init”的未定义引用,在 Cygwin 上构建 GMP 程序
undefined reference to `__imp___gmpz_init', building GMP program on Cygwin
我正在尝试在 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。
已修复: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 文件。
我在 Windows 上使用带有代码块的 gmp.h 时也遇到了同样的问题 7. 我的解决方案
1.安装cygwin时从deval安装gmp
2. 在编辑器的链接器中添加路径 libgmp.a 和 libgmp.dll.a 的路径
3. 全部重建。
使用 g++ main.c -o main -lgmp
对我有用。
基本上,我所要做的就是把 -lgmp
放在最后。
我正在尝试在 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。
已修复: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 文件。
我在 Windows 上使用带有代码块的 gmp.h 时也遇到了同样的问题 7. 我的解决方案 1.安装cygwin时从deval安装gmp 2. 在编辑器的链接器中添加路径 libgmp.a 和 libgmp.dll.a 的路径 3. 全部重建。
使用 g++ main.c -o main -lgmp
对我有用。
基本上,我所要做的就是把 -lgmp
放在最后。