2017-03-17 4 views
1

C++ 17에서 auto_ptr이 제거되었으므로 C++ 1z 모드에서 clang 3.9로 부스트를 컴파일 할 때 오류가 발생했습니다. 그러나, 나는 성공적으로 C++ 14 모드로 부스트를 컴파일하고 lib 파일을 C++ 1z 모드로 컴파일 된 실행 파일에 연결했습니다. 미래에 어떤 ABI 문제 또는 잠재적 인 버그가있을 것입니까?clang 3.9, auto_ptr 및 boost

+1

'auto_ptr'을 사용하지 말아야합니다. 'unique_ptr' (또는 아마도'shared_ptr')로 대체되었습니다. –

+1

@ 물론, auto_ptr을 사용하는 부스트 라이브러리이므로 컴파일을 전달하려면 C++ 14 모드로 전환해야하고, 그런 다음 C++ 1z 실행 파일과 링크해야합니다. – Krys

+0

@chris, 미리 감사드립니다. – Krys

답변

1

auto_ptr과 관련된 ABI 문제는 헤더 전용 기능이므로 libC++. dylib에는 없습니다.

libC++ 헤더를 포함하기 전에 _LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR을 정의하여 libC++에서 auto_ptr을 다시 얻을 수도 있습니다.

가장 좋은 해결책은 C++ 용으로 컴파일 할 때 auto_ptr을 사용하지 않으려는 사용중인 부스트 라이브러리의 관리자에게 문의하는 것입니다.

+0

그러나 auto_ptr의 ABI 문제뿐만 아니라 다른 컴파일러 플래그가있는 2 개의 대상 파일을 결합합니다. 그러나 C++ 1z 모드에서 매크로를 적용하면 ABI 문제가없는 작업을 수행해야합니다. 그리고 지식을 공유해 주셔서 감사합니다. – Krys

+0

다른 컴파일러 플래그로 2 개의 타겟 파일을 결합하는 것은 문제가 있습니다. 가끔, 그들은 링크하지 않을 것이다 ('-arch i386'과'-arch x86_64'). 때로는 잘 작동합니다 (위의 예 참조). 때로는 하나의 특정 호출 ('-d _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT')이있을 때까지 작동하는 것처럼 보일 수도 있습니다. –