2017-02-28 52 views
0

我收到一個奇怪的錯誤,我懷疑與我的系統配置有關。我正在編譯/鏈接使用g ++的簡單C++程序--version = g++ (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609默認語言標準被記錄爲C++ 98,但即使指定了-std = C++ 98選項,我也會在輸出.o文件中看到C++ 11符號。這是我的TEST.CPP:gcc使用C++ 11標準,即使98明確指定

#include <string> 
int main() { 
    std::string str = "Hello World!"; 
    return 0; 
} 

這裏是我的編譯和鏈接命令(有可能是不必要的露骨的語言標準選項)和相關的輸出:

$ g++ -c -Wall -std=c++98 -o test.o test.cpp 
$ g++ -Wall -std=c++98 -o test test.o 
$ nm -C test.o 
       U __gxx_personality_v0 
0000000000000000 T main 
       U __stack_chk_fail 
       U _Unwind_Resume 
       U std::allocator<char>::allocator() 
       U std::allocator<char>::~allocator() 
       U std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&) 
       U std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string() 

通知書__cxx11::*引用。我認爲那些是編譯器插入的C++ 11符號。我得到了一個成功的構建,但顯然使用C++ 11。下面是LDD輸出:

$ ldd test 
    linux-vdso.so.1 => (0x00007ffc381f5000) 
    libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f6548d48000) 
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f6548b32000) 
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f6548768000) 
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f654845f000) 
    /lib64/ld-linux-x86-64.so.2 (0x000055785493c000) 

對於我真正的項目,我要鏈接到第三方庫是C++ 98,但我不能這樣做,因爲這個編譯器的問題等等。我的目標文件正在這些庫中尋找C++ 11符號,但找不到它們。任何見解?

+0

在我看來,你的libstdC++是用C++ 11編譯的,所以你可能需要使用另一個來獲得非C++ 11符號。但是,不是100%肯定的,因爲我不確定共享庫是否可以同時包含C++ 11和更舊的符號 – awksp

+1

C++ 11和C++ 98是該語言的*一致性級別*。要鏈接一個庫來生成可執行文件,庫必須使用相同的構建系統進行開發。不應將不同編譯器產生的對象(無論您聲明的任何語言一致性級別)鏈接在一起。 –

+2

作爲一個經驗法則,除非使用相同的C++編譯器構建,否則C++代碼不能鏈接到「第三方庫」。當然,編譯器可以提供與同一編譯器的其他版本的ABI兼容性,無論此ABI兼容性是否由-std = C++ 98提供,都不清楚。這個選項所做的就是指定代碼編譯的語言標準。 –

回答

2

如描述here,libstdC++ v.6支持新舊ABI。我不得不放置

-D_GLIBCXX_USE_CXX11_ABI = 0

到生成文件的克++命令。這照顧了lib不兼容性。

+0

您應該更喜歡在命令行或makefile中或其他地方定義該宏。在源文件中定義它是限制性的,脆弱的,並且對於其他試圖使用你的代碼的人來說非常令人驚訝。 – rubenvb

+0

我在Makefile的g ++命令中加了'-D_GLIBCXX_USE_CXX11_ABI = 0'。這絕對是做到這一點的方法。謝謝。 – Cosmo

相關問題