C++ GMP 库 ostream 运算符<< compiles but doesn't link?

问题描述 投票:0回答:3
$ 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)
。 什么给出?

c++ linux gmp
3个回答
13
投票

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

g++ -c test.cpp -o test.o -lgmpxx -lgmp
#                         ^^^^^^^

1
投票

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

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

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


0
投票

与此同时,虽然 11.5 年后这个问题仍然没有解决,您可以使用以下解决方法:

mpz_class ans;
// ... compute ans as you need
// ...
// DEBUG-PRINT:
// Use: ans.get_str()
std::cout << ans.get_str() << std::endl;

这对我在 Ubuntu 22.04 上有效。链接仍然不起作用 - 与此问题相同的错误。

© www.soinside.com 2019 - 2024. All rights reserved.