C++ GMP 库 ostream 运算符<<编译但不链接?

C++ GMP Library ostream operator<< compiles but doesn't link?

本文关键字:lt 链接 编译 GMP 运算符 C++ ostream      更新时间:2023-10-16
$ apt-cache show libgmp10
Package: libgmp10
...
Version: 2:5.0.2+dfsg-2ubuntu2

test.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++库以及C库:

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

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

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

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