2013-01-04 63 views
2
$ apt-cache show libgmp10 
Package: libgmp10 
... 
Version: 2:5.0.2+dfsg-2ubuntu2 

TEST.CPPC++ GMP库ostream运算符<<编译但不链接?

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

using namespace std; 

int main() 
{ 
    mpz_class x = 42; 

    cout << x; 
} 

编译:

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

OK

链接:

$ 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)。是什么赋予了?

+0

有疑问时只需验证与pkg配置正确的选项(如果LIB使用pkg配置) – user1824407

+0

@ user1824407:'pkg配置libgmp10'没有返回值? –

+0

它比您认为软件包名称与lib-name不同的更常见,有时甚至标志中的名称也不相同。我建议'pkg-config --list-all | grep -i gmp'从结果中选择'rightName'并从结果中选择'pkg-config --cflags rightName',为libs – user1824407

回答

8

您需要的C++库和C库链接:

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

其实它看起来像我需要提及 –

+0

@AndrewTomazosFathomlingCorps:嗯,我明白了。尝试'libgmpxx.so'上的'ldd'并查看'libgmp.so'是否显示为依赖项。它为我做。 –

+0

它确实具有依赖性,并且在玩具示例中它可以工作,但是我在大项目中没有链接错误:'/usr/include/gmpxx.h:1984:对__gmpf_clear'的未定义引用“。 Odd –

1

除了从Kerrek SB答案我可以证实,从我的实验2个的事情与此:

  1. 的夹杂物对于-lgmp-lgmpxx都是相同的,因为g++ -M main.cpp -lgmp的输出是相同的g++ -M main.cpp -lgmpxx
  2. g ++/gcc对这2 fl使用不同的库AGS因为g++ main.cpp -Wl,-t -lgmpg++ main.cpp -Wl,-t -lgmpxx不同,只有最后一个工作

我有GMP没有经验,但由于该目录是硬编码在gcc的配置,至少在这个Ubuntu的构建,你需要做的海湾合作委员会输出更详细,并使用很多耐心解析所有的输出,也许你会找到真正的原因。