> 백엔드 개발 > C++ > C 0x 모드에서 libc를 사용하는 Clang이 Boost::program_options 예제를 연결하지 못하는 이유는 무엇입니까?

C 0x 모드에서 libc를 사용하는 Clang이 Boost::program_options 예제를 연결하지 못하는 이유는 무엇입니까?

DDD
풀어 주다: 2024-11-02 15:21:30
원래의
758명이 탐색했습니다.

Why does Clang with libc   in C  0x mode fail to link Boost::program_options examples?

이 Boost::program_options 예제를 링크하는 c 0x 모드에서 libc를 사용할 수 없는 이유는 무엇입니까?

배경:

C 0x 모드에서 Clang을 사용하여 Boost::program_options 예제를 컴파일하고 링크하려고 할 때 libc , 다음 오류가 발생합니다.

Undefined symbols for architecture x86_64:
  // Various undefined symbols related to Boost::program_options
로그인 후 복사

설명:

이 오류의 주된 이유는 libc가 GCC의 libstdc와 바이너리 호환되지 않기 때문입니다. 특히:

  • libstdc에서 std::string은 참조 계산됩니다.
  • libc에서 std::string은 메모리가 다른 "SSO(짧은 문자열 최적화)"를 사용합니다. 레이아웃과 동작.

해결책:

이 문제를 해결하려면 libc를 표준 라이브러리로 사용하여 Clang을 사용하여 Boost를 다시 빌드해야 합니다.

clang++ -stdlib=libc++ ...
로그인 후 복사

바이너리를 사용하는 이유 비호환성:

바이너리 비호환성으로 인한 우발적인 혼합 및 런타임 충돌을 방지하기 위해 libc는 C 11의 인라인 네임스페이스 기능을 활용하여 동일한 API를 유지하면서 std::string의 ABI(Application Binary Interface)를 수정합니다( 응용 프로그래밍 인터페이스). 이렇게 하면 링커가 libstdc의 std::string과 libc의 std::string을 구별할 수 있습니다.

위 내용은 C 0x 모드에서 libc를 사용하는 Clang이 Boost::program_options 예제를 연결하지 못하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿