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

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

DDD
DDD원래의
2024-11-02 15:21:30680검색

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

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

배경:

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

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의 인라인 네임스페이스 기능을 활용하여 ABI(Application Binary Interface)를 수정합니다. std::string은 동일한 API(응용 프로그래밍 인터페이스)를 유지합니다. 이렇게 하면 링커가 libstdc의 std::string과 libc의 std::string을 구별할 수 있습니다.

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

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.