4
$ 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)リンク時に見つかりません。何を与える?

4

2 に答える 2

12

C++ ライブラリと C ライブラリをリンクする必要があります。

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

Kerrek SBからの回答に加えて、これを使用した実験から 2 つのことを確認できます。

  1. の出力が同じであるため、インクルージョンは両方-lgmpで同じです-lgmpxxg++ -M main.cpp -lgmpg++ -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 に答える