【问题标题】:How to compile C++ on Mac OS using TR1如何使用 TR1 在 Mac OS 上编译 C++
【发布时间】:2017-03-22 02:13:07
【问题描述】:

我有一个基于 Linux 的现有产品,我正在尝试将其移植到 Mac OS。

msoulier@merlin:~$ xcode-select -v
xcode-select version 2343.
msoulier@merlin:~$ g++ -v
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 7.3.0 (clang-703.0.29)
Target: x86_64-apple-darwin15.6.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

问题在于它使用了 tr1/tuple 库,并且由于某种原因, 不在默认包含路径中。

msoulier@merlin:~$ ls /usr/include/c++/4.2.1/tr1/tuple
/usr/include/c++/4.2.1/tr1/tuple

所以它就在那里,它应该在包含路径中,基于 --with-gxx-include-dir 选项,

还有

msoulier@merlin:~$ cat hello.cpp
#include <iostream>
#include <tr1/tuple>

using namespace std;

int main(void) {
    cout << "Hello, World!" << endl;
    return 0;
}
msoulier@merlin:~$ g++ -o hello hello.cpp
hello.cpp:2:10: fatal error: 'tr1/tuple' file not found
#include <tr1/tuple>
        ^
1 error generated.

为什么这不起作用?

谢谢。

【问题讨论】:

    标签: c++ xcode macos tr1


    【解决方案1】:

    简答:使用-stdlib=libstdc++ 调用clang++,tr1 标头将在那里。

    长答案: 您的错误和 2 套 C++ 包含的原因是 macOS/Xcode 有两个不同的 C++ 标准库,您可以针对它们构建:旧的 GNU libstdc++,以及新的和现代的 LLVM libc++

    从 macOS 10.12 Sierra 开始,默认值为 libc++,而 libstdc++ 已弃用。 libstdc++ 已经很老了,v4.2.1,早于 C++11(因此有 tr1 标头)。如果您要长期维护此代码,值得花时间使其符合 C++11(即#include &lt;tuple&gt;

    更新: Xcode 10 不再允许针对 libstdc++ 进行构建。要么更新你的代码库以使用标准 C++11 头文件,要么使用 Xcode 9,如果这真的不是一个选项。

    【讨论】:

    • 我在哪里可以找到解释这一点的文档?我找不到任何明显的东西,但我可能会错过它。
    • 不幸的是,我找不到任何解释这种情况的 Apple 文档。我相信当 libc++ 首次被包含(10.7)并且可能在它成为默认值(10.9?)时,它在发行说明中被提及,但仅此而已。这个tr1的区别是两者最大的不兼容。
    • 如何用-stdlib=libstdc++调用clag++?对不起,我是新手
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-24
    • 2011-07-08
    • 1970-01-01
    • 2014-12-12
    • 1970-01-01
    • 2017-09-27
    • 2011-03-21
    相关资源
    最近更新 更多