2017-02-28 1 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 기호가 표시됩니다. 여기 gcc C++ 11 표준을 사용하는 경우에도 명시 적으로

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

은 (아마도 불필요한 명시 적 언어 표준 옵션) 내 컴파일 및 링크 명령입니다 및 관련 출력 : __cxx11::*에 대한 참조

$ 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() 

주의 사항이 내 Test.cpp에 있습니다. 컴파일러가 삽입 한 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을하지만 때문에이 컴파일러 문제로 그렇게 할 수없는 오전 타사 libs와 링크해야합니다. 내 개체 파일은 해당 libs에서 C++ 11 기호를 찾고 있지만 찾을 수 없습니다. 어떤 통찰력?

+0

libstdC++는 C++ 11로 컴파일 된 것으로 보이므로 다른 C++ 11 기호를 얻기 위해 다른 것을 사용해야 할 수도 있습니다. 공유 라이브러리에 C++ 11 및 이전 기호가 모두 포함될 수 있는지 여부는 확실하지 않으므로 100 % 확신 할 수 없습니다. – awksp

+1

C++ 11 및 C++ 98은 언어의 * 적합 수준 *입니다. 라이브러리를 링크하여 실행 파일을 생성하려면 라이브러리가 동일한 빌드 시스템으로 개발되어야합니다. 당신은 서로 다른 컴파일러에 의해 생성 된 객체를 링크해서는 안됩니다 * 당신이 선언 한 언어 적합성 수준 *. –

+2

엄밀히 말하면 C++ 코드는 동일한 C++ 컴파일러로 빌드하지 않는 한 "타사 라이브러리"에 링크 할 수 없습니다. 물론 컴파일러는이 컴파일러의 ABI 호환성이 -std = C++ 98에서 제공되는지 여부와 관계없이 동일한 컴파일러의 다른 버전과 ABI 호환성을 제공 할 수 있습니다. 이 옵션은 코드가 컴파일되는 언어 표준을 지정합니다. –

답변

2

here에서 설명한대로 libstdC++ v.6은 새롭고 오래된 ABI를 지원합니다. 나는 메이크의 g의 ++ 명령에

-D_GLIBCXX_USE_CXX11_ABI = 0

을 배치했다. 그 lib 비호 환성의 돌봐.

+0

커맨드 라인이나 메이크 파일에서 그 매크로를 정의하는 것을 선호해야한다. 소스 파일에 정의하면 코드를 사용하려고하는 사람에게 제한적이고 취약하며 상당히 놀랍습니다. – rubenvb

+0

'-D_GLIBCXX_USE_CXX11_ABI = 0'을 Makefile의 g ++ 명령에 추가했습니다. 그것은 확실히 그것을 할 수있는 방법입니다. 감사. – Cosmo

관련 문제