3

我在使用以下方法编译程序时遇到问题:

最新的 Msys 和 MinGW 安装 Windows 7 Pro / Intel Core I5 / 8GB

GMP 5.1.2 库 - 头文件位于 C:\gmp\include - .a 和 .la 文件位于 C:\gmp\lib

我最初将此作为 Eclipse 问题发布,但沉默一直震耳欲聋。从那以后,我尝试在 msys 中仅使用 gcc 进行编译,但遇到了同样的问题。我编译使用:

g++ -I /c/gmp/include -O0 -g3 -Wall -c -fmessage-length=0 -o main.o ./main.cpp

这似乎成功完成。然后我链接使用:

g++ -L /c/gmp/lib -o GMPDebug.exe main.o

结果:

main.o:在函数main': C:\Users\Clay\workspace\GMPDebug\Debug/../main.cpp:22: undefined reference to__gmpz_init_set_str'collect2.exe:错误:ld返回1退出状态

该程序非常简单 - 足以让库正常工作:

#include <getopt.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <time.h>
#include <iostream>
#include <gmpxx.h>
#include <gmp.h>

using namespace std;

int main ()
{
    mpz_t p;
    mpz_init_set_str (p,"3",10); 

    return 0;
}

所有包含的内容都是因为我从一个更大的程序中缩减了它。知道如何解决这个问题吗?

谢谢!

4

1 回答 1

3

这是使用 Eclipse CDT、MinGW 和 msys for C++ 设置当前(截至 2013 年 7 月 2 日)GNU bignum 库的正确过程。要搞定这个,你应该以前用过Unix或Linux,还有Windows,你应该对编程和编译程序有一个模糊的回忆。这是一个多星期的研究和顽固挫折的高潮,所以如果我把事情搞砸了,请礼貌地记下,否则我会用我的思想把你炸死!

1) 我假设你已经下载并安装了 Eclipse 和 MinGW,并且已经将 msys 安装到了 MinGW。你必须在 msys 之前安装 MinGW!

2) 将 GMP 库的压缩包从 gmplib.org 下载到 ${gmp_download}。我下载了 gmp-5.1.2.tar.xz,因为我从来没有使用过 lzip,也不知道它是否在 msys 中可用。

3) 打开一个 msys 窗口(本质上是一个 bash shell)。cd ${gmp_buid} 和 tar -Jxvf ${gmp_download}/gmp-xxxtar.xz

这些 tar 选项与您在网络上其他地方可能找到的不同!-Jxvf 适用于 xz(我认为是 lzip),但对于 gzip,您使用 -xzvf。

4) cd gmp-xxx 并运行 ./config.guess。写下输出。接下来你将需要它。

5) 运行 ./configure --prefix=${gmp_build} --build=<config.guess output> --enable-cxx --with-gnu-ld

显然,如果您没有明确告诉 GMP 为您的平台构建,它会构建所有内容,这很糟糕。cxx 选项构建 C++ 库,并且 --with-gnu-ld 允许它与 ld 一起使用。很简单。

6) 制作

7) 进行安装

例如:假设您安装到 C:/gmp。你应该有 gmp/include/gmp.h 和 gmpxx.h。您还应该有 gmp/lib/libgmp.a、libgmp.la、libgmpxx.a、libgmpxx.la。您还应该有一个包含内容的共享目录。

8)设置日食:

  • 转到项目-> 属性
  • 在 C/C++ build --> Environment 下编辑 PATH 变量并添加 ${gmp_build}/include;${gmp_build}/lib
  • 在 C/C++ build --> settings --> tool settings --> GCC Assembler --> general 添加 ${gmp_build}/include 作为包含路径。
  • 相同的地方但 --> GCC C++ 编译器 --> 包含添加 ${gmp_build}/include 作为包含路径。
  • 相同的地方 --> GCC C++ 编译器 --> Miscellaneous 添加 -lgmp -lgmpxx 到该行的 END。线的尽头!
  • 相同的地方 --> GCC C 编译器添加与以前相同的包含路径和其他选项。
  • 相同的地方 --> MinGW C++ 链接器 --> 库 按该顺序将gmpxxgmp添加到“库 (-l)”中!现在将 ${gmp_build}/lib 添加到“库搜索路径 (-L)”
  • 在 C/C++ General --> Paths & Symbols --> Incudes 选项卡下,检查您的包含目录中是否有 ${gmp_build}/include 用于 Assembly、C 和 C++。如果他们不在那里,请添加他们。它们可能已经由 Eclipse 填充。
  • 相同的地方 --> 库选项卡检查你是否有gmpgmpxx在那个顺序。它应该已经被填充。
  • 相同的地方 --> 库路径选项卡检查应该已经存在的 ${gmp_build}/lib。
  • 点击“应用”并确保重建索引,否则更改将不会进行。点击确定关闭。

9) 运行这个小程序来验证你的设置:

#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <gmp.h>
#include <gmpxx.h>

using namespace std;

int main ()
{
    mpz_t p;
    mpz_init_set_ui (p,3);

    return 0;
}

您的编译命令应类似于以下内容:

g++ "-IC:\gmp\include" -O0 -g3 -Wall -c -fmessage-length=0 -lgmp -lgmpxx -o main.o "..\main.cpp"

g++ "-LC:\gmp\lib" -o GMPDebug.exe main.o -lgmpxx -lgmp

笔记:

1)选项的顺序很重要。我不知道所有原因,但如果第二个命令行(链接程序)在 -o 选项之前有 -lgmp -lgmpxx 标志,则链接将失败。

2) -l 标志是一个棘手的标志。它实际上是说“去看看 -L<whatever> for liblibrary.a”。在这种情况下,“在 C:\gmp\lib 中查找 libgmp.a 和 libgmpxx.a”。

3) 我听说过涉及 cout 和 64 位版本的 eclipse 的错误,所以我使用的是 32 位版本,在那里我看到了同样的错误。:-(

4) 如果在链接器中将 gmp 放在 gmpxx 之前,则重载的运算符将不起作用。

于 2013-07-03T03:04:36.583 回答