【问题标题】:undefined reference to `__imp___gmpz_init', building GMP program on Cygwin未定义对 `__imp___gmpz_init' 的引用,在 Cygwin 上构建 GMP 程序
【发布时间】:2015-05-16 18:58:20
【问题描述】:

我正在尝试在 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 效果更好吗?
  • 我将 nm 输出添加到我的问题中。 -m32 完全破坏了它, -m64 给出了相同的结果。但是,这样做使它起作用:gcc test.c /usr/bin/cyggmp-10.dll。不知道为什么。

标签: gcc compiler-errors cygwin gmp


【解决方案1】:

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

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

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

【讨论】:

  • 在SO上确实有很多问题可以解释为什么顺序很重要。
  • 我真的不知道,为什么,例如-lgmp 需要作为最后一个参数。有人可以解释原因吗?
  • 它对我有用(在适用于 Linux 的 Windows 子系统上),但 -lgmp 到底是什么意思?
  • -lgmp 表示链接到 GMP 库,即在 Linux 上在库路径中查找类似 @​​987654327@ 的文件。如果你调用像mpz_init() 这样的函数,汇编代码将在那个.a 文件而不是你的程序中。链接器告诉你的程序如何找到它。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2021-07-02
    • 2017-09-12
    • 2012-12-05
    • 2014-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多