更新 OSX 命令行工具 6.3 后缺少 C++ 标头 <__debug>
Posted
技术标签:
【中文标题】更新 OSX 命令行工具 6.3 后缺少 C++ 标头 <__debug>【英文标题】:Missing C++ header <__debug> after updating OSX Command Line Tools 6.3 【发布时间】:2015-06-14 06:50:28 【问题描述】:从 App Store 更新到命令行工具 6.3 后,包括 <vector>
或 <iterator>
在内的内部包含 <__debug> 的程序会导致找不到文件错误,如下所示。 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:macOS 10.10.3 上的 MacBook Pro
更新:
Apple 在其开发者论坛上验证了该问题。在命令行工具 6.2 中,包含 __debug 的条件如下,但在 6.3 中没有。
#ifdef _LIBCPP_DEBUG
# include <__debug>
#else
# define _LIBCPP_ASSERT(x, m) ((void)0)
#endif
而 libcxx 的人们谈到了移除 __debug here 的保护措施。感觉 __debug 在 OSX 上从来不存在。
【问题讨论】:
你能发布一个最小的例子吗?以及您正在使用的编译器(我假设是 clang++)? 一种解决方法是在相应文件夹中触摸一个空的__debug,但副作用很难说。#include <__debug> int main()
为我工作(使用clang++ test.cpp
编译),我刚刚升级到 10.10.3
更新命令行工具后,目录下没有__debug。您是否也更新了命令行工具 6.3? /Library/Developer/CommandLineTools/usr/include/c++/v1/__debug
我也没有__debug
,但是我发布的最小程序编译得很好。是的,我也更新了命令行工具。
【参考方案1】:
通过Apple's Developer Download Page将命令行工具降级到6.2。
请注意为您的 OS X 下载正确的版本:
OS X 10.10commandlinetoolsosx10.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
在我看来这是最安全的方式,因为:
-
您不会损害您的工具链
Apple 修复问题后,您可以通过 App Store 轻松升级
如果您手动添加文件,则必须稍后将其删除,否则可能会出现更多问题
更新 - 21.04.2015
问题已由 Apple 修复。 安装命令行工具 6.3.1 后一切正常!
【讨论】:
修复与否,它有效,它让我度过了一个下午!谢谢。 很好的链接!我还注意到一些开源包编译可能会随着 6.3 的更新而失败,例如 valgrind。 好吧,我不能再编译 PCL 程序了 ;) 所以今天早上升级后:我恨自己 :) 我不会称之为修复,因为通过安装以前版本的命令行工具,您只需降级它们。例如,Xcode 6.3 的命令行工具基于 LLVM 3.6svn,而 Xcode 6.2 的命令行工具基于 LLVM 3.5svn。 除了安装 dmg(无需卸载)外,无需其他操作。如果有人不愿意尝试此解决方案,可能值得注意。【参考方案2】:临时创建缺少的__debug
文件,其中_LIBCPP_ASSERT
在命令行工具6.2 for 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
【讨论】:
我的部分文件确实有效,但出现了像error: no type named 'allocator' in namespace 'std'
这样的新错误。所以我将命令行工具降级到 6.2
您也可以尝试使用来自LLVM 3.6 repo 的调试头。这是 Xcode 6.3 的基础。
如果这不起作用,在 GitHub 上提到了这个解决方法,它需要完整的 Xcode 安装:sudo xcode-select -s /Applications/Xcode.app/Contents/Developer
添加文件对我不起作用。产生了 4 个错误:string:663:13: error: use of undeclared identifier '_LIBCPP_ASSERT'
【参考方案3】:
警告!!!这是一个 hack,使用风险自负!!!此解决方法仅作为临时修复,直到 Apple 提供命令行工具更新。
好的,我们开始吧:自己创建文件,把下面的内容放进去:
#ifndef _LIBCPP_ASSERT
#define _LIBCPP_ASSERT(...) ((void)0)
#endif
这似乎对我有用,但它肯定不是正确的做法。确保文件位于正确的位置/Library/Developer/CommandLineTools/usr/include/c++/v1/__debug
并具有正确的所有者/权限。
【讨论】:
【参考方案4】:此问题现已在命令行工具 6.3.1 中得到修复,可从https://developer.apple.com/downloads 获得。更新应该会自动出现在您的 App Store 更新中(尽管它被标记为 6.3,而不是 6.3.1)。给您带来的不便深表歉意,非常感谢您报告问题。
早期:在一个简单的案例中对我有用的解决方法是设置最低 OS X 10.8 或更早版本,使用“-mmacosx-version-min=10.8”。
【讨论】:
【参考方案5】:我遵循@Flash Sheridan 的建议,让我的 CLT 再次工作(git、ruby、brew...) - 我使用了“Xcode 6.3.1 的命令行工具 (OS X 10.10)”。
【讨论】:
以上是关于更新 OSX 命令行工具 6.3 后缺少 C++ 标头 <__debug>的主要内容,如果未能解决你的问题,请参考以下文章
在优胜美地更新命令行工具后出现“未找到符号:_getentropy”错误
将 mac osx 10.8 上的 GDB 从 6.3 更新到 7.*