使用GMP和Eclipse C ++(CDT Helios)的问题

时间:2010-10-11 00:05:20

标签: eclipse-cdt gmp

我想在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但仍然遇到了这些问题。非常感谢您的回答。 :)

1 个答案:

答案 0 :(得分:1)

这是使用Eclipse CDT,MinGW和msys for C ++设置当前(截至7月2日)GNU bignum库的正确过程。为了解决这个问题,您之前应该使用Unix或Linux,以及Windows,您应该对编程和编译程序有一个模糊的回忆。这是一个多星期的研究和铁杆挫败感的高潮,所以如果我搞砸了一些东西,请用礼貌的方式记下它,否则我会用我的力量打击你!

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

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

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

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

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

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

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

6)制作

7)make install

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

8)设置eclipse:

转到项目 - &gt;性能 在C / C ++构建下 - &gt;环境编辑PATH变量并添加$ {gmp_build} / include; $ {gmp_build} / lib 在C / C ++构建下 - &gt;设置 - &gt;工具设置 - &gt; GCC汇编程序 - &gt;一般添加$ {gmp_build} / include作为包含路径。 同一个地方但是 - &gt; GCC C ++编译器 - &gt;包括添加$ {gmp_build} / include作为包含路径。 同一个地方 - &gt; GCC C ++编译器 - &gt;杂项将-lgmp -lgmpxx添加到行的END。线的终点! 同一个地方 - &gt; GCC C编译器像以前一样添加相同的包含路径和其他选项。 同一个地方 - &gt; MinGW C ++链接器 - &gt;库添加到“库(-l)”gmp和gmpxx这个订单!现在将$ {gmp_build} / lib添加到“LIbrary Search Path(-L)” 在C / C ++下 - &gt;路径&amp;符号 - &gt; Incudes选项卡检查您在Assembly,C和C ++的include目录中是否有$ {gmp_build} / include。如果他们不在那里你可能搞砸了早先的一步。它们应该由Eclipse自动填充。 同一个地方 - &gt; Libraries选项卡检查你有gmp和gmpxx IN THAT ORDER。它应该已经填充。 同一地点 - &gt;库路径选项卡检查应该已存在的$ {gmp_build} / lib。 点击“应用”并确保重建索引或更改不会。点击OK关闭。 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标志是一个棘手的标志。它实际上是说“Go-in-lib for liblibrary.a”。在这种情况下,“在C:\ gmp \ lib中查找libgmp.a和libgmpxx.a”。

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