2

我想在 CDT 中编译我的代码:

#include <iostream>
#include <gmpxx.h>

using namespace std;

int main (void) {
    mpz_class a, b, c;
    a = 1234;
    b = "-5678";
    c = a+b;
    cout << "sum is " << c << "\n";
    cout << "absolute value is " << abs(c) << "\n";
    cin >> a;
    return 0;
}

当我编译时,出现了一些这样的错误:

**** Build of configuration Debug for project test ****

**** Internal Builder is used for build               ****
g++ -LC:\Dev-Cpp\lib -lgmp -lgmpxx -otest.exe src\test.o
src\test.o(.text$_ZN10__gmp_exprIA1_12__mpz_structS1_ED1Ev[__gmp_expr<__mpz_struct [1], __mpz_struct [1]>::~__gmp_expr()]+0xd): In function `_gmpz_abs':
C:/Dev-Cpp/bin/../lib/gcc/mingw32/3.4.2/../../../../include/gmpxx.h: undefined reference to `__gmpz_clear'
src\test.o(.text$_ZN10__gmp_exprIA1_12__mpz_structS1_EaSEPKc[__gmp_expr<__mpz_struct [1], __mpz_struct [1]>::operator=(char const*)]+0x55):C:/Dev-Cpp/bin/../lib/gcc/mingw32/3.4.2/../../../../include/gmpxx.h: undefined reference to `__gmpz_set_str'
src\test.o(.text$_ZN10__gmp_exprIA1_12__mpz_structS1_EaSEi[__gmp_expr<__mpz_struct [1], __mpz_struct [1]>::operator=(int)]+0x14):C:/Dev-Cpp/bin/../lib/gcc/mingw32/3.4.2/../../../../include/gmpxx.h: undefined reference to `__gmpz_set_si'
src\test.o(.text$_ZN10__gmp_exprIA1_12__mpz_structS1_EC1Ev[__gmp_expr<__mpz_struct [1], __mpz_struct [1]>::__gmp_expr()]+0xd):C:/Dev-Cpp/bin/../lib/gcc/mingw32/3.4.2/../../../../include/gmpxx.h: undefined reference to `__gmpz_init'
src\test.o(.text$_ZlsIA1_12__mpz_structERSoS2_RK10__gmp_exprIT_S4_E[std::basic_ostream<char, std::char_traits<char> >& operator<< <__mpz_struct [1]>(std::basic_ostream<char, std::char_traits<char> >&, __gmp_expr<__mpz_struct [1], __mpz_struct [1]> const&)]+0x1c):C:/Dev-Cpp/bin/../lib/gcc/mingw32/3.4.2/../../../../include/gmpxx.h: undefined reference to `operator<<(std::ostream&, __mpz_struct const*)'
src\test.o(.text$_ZlsIA1_12__mpz_struct16__gmp_unary_exprI10__gmp_exprIS1_S1_E18__gmp_abs_functionEERSoS7_RKS3_IT_T0_E[std::basic_ostream<char, std::char_traits<char> >& operator<< <__mpz_struct [1], __gmp_unary_expr<__gmp_expr<__mpz_struct [1], __mpz_struct [1]>, __gmp_abs_function> >(std::basic_ostream<char, std::char_traits<char> >&, __gmp_expr<__mpz_struct [1], __gmp_unary_expr<__gmp_expr<__mpz_struct [1], __mpz_struct [1]>, __gmp_abs_function> > const&)]+0x6b):C:/Dev-Cpp/bin/../lib/gcc/mingw32/3.4.2/../../../../include/gmpxx.h: undefined reference to `operator<<(std::ostream&, __mpz_struct const*)'
src\test.o(.text$_ZrsIA1_12__mpz_structERSiS2_R10__gmp_exprIT_S4_E[std::basic_istream<char, std::char_traits<char> >& operator>><__mpz_struct [1]>(std::basic_istream<char, std::char_traits<char> >&, __gmp_expr<__mpz_struct [1], __mpz_struct [1]>&)]+0x1c):C:/Dev-Cpp/bin/../lib/gcc/mingw32/3.4.2/../../../../include/gmpxx.h: undefined reference to `operator>>(std::istream&, __mpz_struct*)'
src\test.o(.text$_ZN10__gmp_exprIA1_12__mpz_structS1_EC1IS1_16__gmp_unary_exprIS2_18__gmp_abs_functionEEERKS_IT_T0_E[__gmp_expr<__mpz_struct [1], __mpz_struct [1]>::__gmp_expr<__mpz_struct [1], __gmp_unary_expr<__gmp_expr<__mpz_struct [1], __mpz_struct [1]>, __gmp_abs_function> >(__gmp_expr<__mpz_struct [1], __gmp_unary_expr<__gmp_expr<__mpz_struct [1], __mpz_struct [1]>, __gmp_abs_function> > const&)]+0xd):C:/Dev-Cpp/bin/../lib/gcc/mingw32/3.4.2/../../../../include/gmpxx.h: undefined reference to `__gmpz_init'
src\test.o(.text$_ZN17__gmp_binary_plus4evalEP12__mpz_structPKS0_S3_[__gmp_binary_plus::eval(__mpz_struct*, __mpz_struct const*, __mpz_struct const*)]+0x1b):C:/Dev-Cpp/bin/../lib/gcc/mingw32/3.4.2/../../../../include/gmpxx.h: undefined reference to `__gmpz_add'
src\test.o(.text$__gmpz_abs[___gmpz_abs]+0x1d):C:/Dev-Cpp/bin/../lib/gcc/mingw32/3.4.2/../../../../include/gmpxx.h: undefined reference to `__gmpz_set'
collect2: ld returned 1 exit status
Build error occurred, build is stopped
Time consumed: 1514  ms.

我必须做什么?我在 GCC Linker 中添加了 libgmp.a 和 libgmpxx.a 但仍然遇到这些问题。非常感谢您的回答。:)

4

1 回答 1

1

这是使用 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= --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++ 构建 --> 环境 编辑 PATH 变量并添加 ${gmp_build}/include;${gmp_build}/lib 下 C/C++ 构建 --> 设置 --> 工具设置 - -> GCC Assembler --> 一般添加 ${gmp_build}/include 作为包含路径。相同的地方但 --> GCC C++ 编译器 --> 包含添加 ${gmp_build}/include 作为包含路径。相同的地方 --> GCC C++ 编译器 --> Miscellaneous 添加 -lgmp -lgmpxx 到该行的 END。线的尽头!相同的地方 --> GCC C 编译器添加与以前相同的包含路径和其他选项。相同的地方 --> MinGW C++ 链接器 --> 库 按该顺序将 gmp 和 gmpxx 添加到“库 (-l)”!现在将 ${gmp_build}/lib 添加到 C/C++ General 下的“LIbrary Search Path (-L)” --> Paths & Symbols --> 包含选项卡检查您的包含目录中是否有 ${gmp_build}/include 用于 Assembly、C 和 C++。如果他们不在那里,您可能已经搞砸了之前的步骤。它们应该由 Eclipse 自动填充。相同的地方 --> 库选项卡检查你是否有 gmp 和 gmpxx 在那个顺序。它应该已经被填充。相同的地方 --> 库路径选项卡检查应该已经存在的 ${gmp_build}/lib。点击“应用”并确保重建索引,否则更改将不会进行。点击确定关闭。9) 运行这个小程序来验证你的设置:它应该已经被填充。相同的地方 --> 库路径选项卡检查应该已经存在的 ${gmp_build}/lib。点击“应用”并确保重建索引,否则更改将不会进行。点击确定关闭。9) 运行这个小程序来验证你的设置:它应该已经被填充。相同的地方 --> 库路径选项卡检查应该已经存在的 ${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 -lgmp -lgmpxx

笔记:

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

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

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

于 2013-07-03T03:15:27.553 回答