无法 link 使用 Mingw 在 Linux 上对抗静态库

Can't link against static library with Mingw on Linux

我已经安装了 GMP library 并尝试与 mingw-w64-posix.

交叉编译

我的图书馆在 /usr/local/lib。

我的编译命令如下所示:

x86_64-w64-mingw32-g++-posix src/factorial.cpp -o bin/factorial.win.o -I/usr/local/include -L/usr/local/lib -lgmp -lgmpxx

它抛出一个未定义的引用错误: (我可以从 -L.... 中删除整个块,同样的错误。似乎图书馆出于某种原因没有 link)

/usr/bin/x86_64-w64-mingw32-ld: /tmp/ccxY03WS.o:factorial.cpp:(.text$_ZN23__gmp_binary_multiplies4evalEP12__mpz_structPKS0_S3_[_ZN23__gmp_binary_multiplies4evalEP12__mpz_structPKS0_S3_]+0x27): undefined reference to `__gmpz_mul'
/usr/bin/x86_64-w64-mingw32-ld: /tmp/ccxY03WS.o:factorial.cpp:(.text$_ZN23__gmp_binary_multiplies4evalEP12__mpz_structPKS0_l[_ZN23__gmp_binary_multiplies4evalEP12__mpz_structPKS0_l]+0x26): undefined reference to `__gmpz_mul_si'
/usr/bin/x86_64-w64-mingw32-ld: /tmp/ccxY03WS.o:factorial.cpp:(.text$_ZN10__gmp_exprIA1_12__mpz_structS1_E7init_siEl[_ZN10__gmp_exprIA1_12__mpz_structS1_E7init_siEl]+0x1a): undefined reference to `__gmpz_init_set_si'
/usr/bin/x86_64-w64-mingw32-ld: /tmp/ccxY03WS.o:factorial.cpp:(.text$_ZN10__gmp_exprIA1_12__mpz_structS1_EC1EOS2_[_ZN10__gmp_exprIA1_12__mpz_structS1_EC1EOS2_]+0x2e): undefined reference to `__gmpz_init'
/usr/bin/x86_64-w64-mingw32-ld: /tmp/ccxY03WS.o:factorial.cpp:(.text$_ZN10__gmp_exprIA1_12__mpz_structS1_ED1Ev[_ZN10__gmp_exprIA1_12__mpz_structS1_ED1Ev]+0x14): undefined reference to `__gmpz_clear'
collect2: error: ld returned 1 exit status

但是,如果我将编译器更改为 g++,则一切正常。

好的-

  1. link 错误(__gmpz_init、__gmpz_clear 等)是 GMP“内部”。它们应该来自 C 语言基础库 libgmp。

  2. 引用它们的代码 (.text$ZN23__gmp_binary_multiplies4evalEP12__mpz_structPKS0_S3[ZN23__gmp_binary_multiplies4evalEP12__mpz_structPKS0_S3 ], 等) 是“名称损坏的”C++。

  3. 我怀疑问题是你的“gmpxx”库是用不同的 C++编译器构建的,那个与 MinGW 有不同“名称修改”约定。

解决方案:

下载完整的 libGMP 源代码(例如来自 https://gmplib.org/,并使用您的 libmingw-w64-posix++ C++ 交叉编译器重建一切(包括 libgmpxx)。


附录:

我下载了 gmp-6.2.1 源码,在这里找到 __gmpz_clear:

gmp-6.2.1\gmp-h.in

#define mpz_clear __gmpz_clear
__GMP_DECLSPEC void mpz_clear (mpz_ptr);

“gmp-h.in”是项目的“autoconf”使用的模板,用于生成指定目标环境的libGMP源文件。

这反过来意味着:

  1. 您开始的项目(在您最初的问题中)没有为 MinGW 配置

...和...

  1. 当您尝试从源代码构建时,您没有 运行 正确“配置”。

建议:

  1. 再次尝试从源代码构建 libGMP。删除所有内容,从 libGMP tarball 中重新提取,并仔细按照安装说明进行操作:

    ./configure
    make
    make check       <= VERY IMPORTANT!!
    make install
    
  2. 我很好奇你的构建环境(Windows?Linux?)、编译器(准确的 MinGW 版本)和目标(如果你构建在 Windows 工作站,您想 运行 您的 GMP 应用程序作为 Windows .exe) 吗?