c++ - 포함 - 전처리기 정의




OSX 명령 행 도구 6.3을 업데이트 한 후 C++ 헤더<__ debug>가 누락 됨 (4)

App Store에서 Command Line Tools 6.3으로 업데이트 한 후 내부적으로 <__ debug>를 포함하는 <vector> 또는 <iterator> 를 포함한 프로그램은 다음과 같이 파일을 찾을 수 없음 오류를 발생시킵니다. cpp는 흥미롭지 않지만 포함 된 헤더 중 하나에 포함됩니다.

c++ -O3 -I/Users/farleylai/Documents/dev/git/ESMS/Optimizer/../StreamIt/src/cluster/headers -L/Users/farleylai/Documents/dev/git/ESMS/Optimizer/../StreamIt/build/binaries/clusterStaticLibrary /Users/farleylai/Documents/dev/git/ESMS/Optimizer/build/StreamIt/FIR/511/512/combined_threads.cpp -o streamit -lcluster -lpthread -lstdc++
In file included from /Users/farleylai/Documents/dev/git/ESMS/Optimizer/build/StreamIt/FIR/511/512/combined_threads.cpp:9:
In file included from /Users/farleylai/Documents/dev/git/ESMS/Optimizer/../StreamIt/src/cluster/headers/node_server.h:22:
In file included from /Users/farleylai/Documents/dev/git/ESMS/Optimizer/../StreamIt/src/cluster/headers/thread_info.h:20:
In file included from /Users/farleylai/Documents/dev/git/ESMS/Optimizer/../StreamIt/src/cluster/headers/connection_info.h:19:
/Users/farleylai/Documents/dev/git/ESMS/Optimizer/../StreamIt/src/cluster/headers/socket_holder.h:43:25: warning: delete called on 'mysocket' that is abstract but has non-virtual destructor
      [-Wdelete-non-virtual-dtor]
    if (!is_mem_socket) delete sock;
                        ^
In file included from /Users/farleylai/Documents/dev/git/ESMS/Optimizer/build/StreamIt/FIR/511/512/combined_threads.cpp:9:
In file included from /Users/farleylai/Documents/dev/git/ESMS/Optimizer/../StreamIt/src/cluster/headers/node_server.h:22:
In file included from /Users/farleylai/Documents/dev/git/ESMS/Optimizer/../StreamIt/src/cluster/headers/thread_info.h:26:
In file included from /Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/vector:265:
In file included from /Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/__bit_reference:15:
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/algorithm:641:10: fatal error: '__debug' file not found
#include <__debug>
         ^

이 문제를 해결할 아이디어가 있습니까? 추가 C ++ 플래그를 지정하지는 않습니다.

감사.

PS : OSX 10.10.3의 MacBook Pro

업데이트 :

이 문제는 개발자 포럼에서 Apple에 의해 확인되었습니다. Command Line Tools 6.2에서 __debug의 포함은 다음과 같이 조건부로 보호되지만 6.3에서는 보호되지 않습니다.

#ifdef _LIBCPP_DEBUG
#   include <__debug>
#else
#   define _LIBCPP_ASSERT(x, m) ((void)0)
#endif

그리고 libcxx 사람들은 __debug의 가드를 제거하는 것에 대해 이야기 here . __debug가 OSX에 존재하지 않는 것 같습니다.


@Flash Sheridan의 조언을 따르고 CLT가 다시 작동하게했습니다 (git, ruby, brew ...)- "Xcode 6.3.1에는 명령 줄 도구 (OS X 10.10)를 사용했습니다."


OS X 용 명령 행 도구 6.2에서와 같이 _LIBCPP_ASSERT 가 정의 된 누락 된 __debug 파일을 임시로 작성하십시오.

echo '#define _LIBCPP_ASSERT(x, m) ((void)0)' | sudo tee -a /Library/Developer/CommandLineTools/usr/include/c++/v1/__debug > /dev/null

빌드가 완료된 후 임시 파일을 제거하십시오.

sudo rm /Library/Developer/CommandLineTools/usr/include/c++/v1/__debug

Apple 개발자 다운로드 페이지 를 통해 명령 행 도구를 6.2로 다운 그레이드하십시오.

OS X에 맞는 올바른 버전을 다운로드하십시오.

  • OS X 10.10 commandlinetoolsosx10.10forxcode6.2.dmg
  • OS X 10.9 commandlinetoolsosx10.9forxcode6.2.dmg

__debug 의 포함은 명령 줄 도구 6.2에서 다음과 같이 조건부로 보호되지만 6.3에서는 그렇지 않기 때문에 작동합니다.

#ifdef _LIBCPP_DEBUG
#   include <__debug>
#else
#   define _LIBCPP_ASSERT(x, m) ((void)0)
#endif

제 생각에는 이것이 가장 안전한 방법입니다.

  1. 툴체인을 손상시키지 않습니다
  2. Apple이 문제를 해결할 때 App Store를 통해 쉽게 업그레이드 할 수 있습니다
  3. 파일을 수동으로 추가하면 나중에 파일을 삭제해야합니다. 그렇지 않으면 더 많은 문제가 발생할 수 있습니다.

업데이트-2015 년 4 월 21 일

Apple에서 수정 문제 . Command Line Tools 6.3.1을 설치하면 모든 것이 예상대로 작동합니다!


경고!!! 이것은 해킹입니다, 당신 자신의 위험에 사용하십시오! 이 해결 방법은 Apple이 명령 줄 도구에 대한 업데이트를 제공 할 때까지 임시 수정 으로 만 사용됩니다.

좋아, 여기에 우리가 간다 : 파일을 직접 만들고 다음 내용을 넣으십시오.

#ifndef _LIBCPP_ASSERT
#define _LIBCPP_ASSERT(...) ((void)0)
#endif

이것은 나에게 효과가있는 것 같지만 반드시해야 할 일은 아닙니다. 파일이 올바른 소유자 / 권한이있는 올바른 위치 /Library/Developer/CommandLineTools/usr/include/c++/v1/__debug 있는지 확인하십시오.





clang