更新 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 后,包括 &lt;vector&gt;&lt;iterator&gt; 在内的内部包含 <__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 &lt;__debug&gt; 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.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

在我看来这是最安全的方式,因为:

    您不会损害您的工具链 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”错误

在 Swift 中使用命令行工具更新当前行

将 mac osx 10.8 上的 GDB 从 6.3 更新到 7.*

如何从 OSX Swift 命令行工具或 shebang 脚本文件显示窗口?

使用 C++ 入口点让 SDL 在 OSX 上工作

sh [Magento 1.x]在MAC OSX中添加Wiz命令行工具