4
$ apt-cache show libgmp10
Package: libgmp10
...
Version: 2:5.0.2+dfsg-2ubuntu2

测试.cpp

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

using namespace std;

int main()
{
    mpz_class x = 42;

    cout << x;
}

编译:

$ g++ -c test.cpp -o test.o
$

好的

关联:

$ g++ test.o -lgmp
test.o: In function `std::ostream& operator<<
    <__mpz_struct [1]>(std::ostream&,
         __gmp_expr<__mpz_struct [1],
              __mpz_struct [1]> const&)':

test.cpp:(.text._ZlsIA1_12__mpz_structERSoS2_RK10__gmp_exprIT_S4_E[_ZlsIA1_12__mpz_structERSoS2_RK10__gmp_exprIT_S4_E]+0x2a):

undefined reference to `operator<<(std::ostream&, __mpz_struct const*)'
collect2: error: ld returned 1 exit status

它在链接时找不到operator<<(ostream&, mpz_class)。是什么赋予了?

4

2 回答 2

12

您需要链接 C++ 库以及 C 库:

g++ -c test.cpp -o test.o -lgmpxx -lgmp
#                         ^^^^^^^
于 2013-01-04T20:35:47.447 回答
1

除了Kerrek SB的回答之外,我还可以从我的实验中确认两件事:

  1. 两者的夹杂物是相同的-lgmp-lgmpxx因为 的输出g++ -M main.cpp -lgmp是相同的g++ -M main.cpp -lgmpxx
  2. g++/gcc 对这 2 个标志使用不同的库,因为g++ main.cpp -Wl,-t -lgmp不同于g++ main.cpp -Wl,-t -lgmpxx并且只有最后一个有效

我没有使用 GMP 的经验,但由于这个目录在 gcc 配置中是硬编码的,至少在这个 Ubuntu 版本中,你需要让 gcc 输出更详细,并耐心地解析所有输出,也许你会找到这个的真正原因。

于 2013-01-04T21:24:29.933 回答