更新OSX命令行工具6.3后缺lessC ++头<__ debug>

从App Store更新到命令行工具6.3后,内部包含<__ debug>的<vector><iterator>程序将导致文件未find错误,如下所示。 该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

更新:

这个问题在苹果的开发者论坛上得到了validation。 在命令行工具6.2中,包含的__debug被有条件地保护,但不在6.3中。

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

而libcxx的人们在这里谈到了去除__debug的卫兵。 感觉像__debug从来没有在OSX上存在。

通过Apple的开发者下载页面将命令行工具降级到6.2

请小心为您的OS X下载正确的版本:

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

这是有效的,因为在命令行工具6.2中,包含__debug的条件保护如下,但不在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 修复问题 。 安装命令行工具6.3.1后,一切都按预期工作!

临时创build缺less的__debug文件,其中_LIBCPP_ASSERT在命令行工具6.2中为OS X定义。

 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 

警告!!! 这是一个黑客,使用风险自负! 这个解决方法只是作为一个临时修复,直到苹果提供了命令行工具的更新。

好吧,我们开始吧:自己创build文件,并将下列内容放入其中:

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

似乎对我有用,但是这当然不是正确的做法。 确保文件位于正确的位置/Library/Developer/CommandLineTools/usr/include/c++/v1/__debug具有正确的所有者/权限。

现在已经在https://developer.apple.com/downloads上提供的命令行工具6.3.1中解决了这个问题。; 更新应该自动出现在你的App Store更新中(尽pipe它被标记为6.3,而不是6.3.1)。 对此造成的不便表示歉意,非常感谢您报告此问题。

早些时候:在一个简单的例子中,一个解决方法是在OS X 10.8或更低版本中设置一个最小的“-mmacosx-version-min = 10.8”。

我遵循@Flash Sheridan的build议,并让我的CLT再次工作(混帐,ruby,酿造…) – 我使用“Xcode 6.3.1命令行工具(OS X 10.10)”。