获取gmp库

时间:2013-06-30 00:36:19

标签: mingw gmp msys

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

最新的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;
}

所有这些包括因为我从较大的程序中减少了这一点。知道如何解决这个问题吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

这是使用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 =&lt; config.guess output&gt; --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;库在这个订单中添加 gmpxx gmp 的“库(-l)”!现在将$ {gmp_build} / lib添加到“Library Search Path(-L)”
  • 在C / C ++ General下 - &gt;路径&amp;符号 - &gt; Incudes选项卡检查您在Assembly,C和C ++的include目录中是否有$ {gmp_build} / include。如果他们不在那里添加它们。它们可能已经被Eclipse填充。
  • 同一个地方 - &gt; Libraries选项卡检查您是否有 gmp gmpxx IN THAT ORDER。它应该已经填充。
  • 同一地点 - &gt;库路径选项卡检查$ {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标志是一个棘手的标志。它实际上是说“Go-in&lt; whatever&gt; for liblibrary.a”。在这种情况下,“在C:\ gmp \ lib中查找libgmp.a和libgmpxx.a”。

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

4)如果在链接器中将gmp放在gmpxx之前,那么重载的运算符将无效。

相关问题