시스템 구성과 관련하여 이상한 오류가 발생했습니다. 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 기호를 찾고 있지만 찾을 수 없습니다. 어떤 통찰력?
libstdC++는 C++ 11로 컴파일 된 것으로 보이므로 다른 C++ 11 기호를 얻기 위해 다른 것을 사용해야 할 수도 있습니다. 공유 라이브러리에 C++ 11 및 이전 기호가 모두 포함될 수 있는지 여부는 확실하지 않으므로 100 % 확신 할 수 없습니다. – awksp
C++ 11 및 C++ 98은 언어의 * 적합 수준 *입니다. 라이브러리를 링크하여 실행 파일을 생성하려면 라이브러리가 동일한 빌드 시스템으로 개발되어야합니다. 당신은 서로 다른 컴파일러에 의해 생성 된 객체를 링크해서는 안됩니다 * 당신이 선언 한 언어 적합성 수준 *. –
엄밀히 말하면 C++ 코드는 동일한 C++ 컴파일러로 빌드하지 않는 한 "타사 라이브러리"에 링크 할 수 없습니다. 물론 컴파일러는이 컴파일러의 ABI 호환성이 -std = C++ 98에서 제공되는지 여부와 관계없이 동일한 컴파일러의 다른 버전과 ABI 호환성을 제공 할 수 있습니다. 이 옵션은 코드가 컴파일되는 언어 표준을 지정합니다. –