如何使用 TR1 在 Mac OS 上编译 C++

How to compile C++ on Mac OS using TR1

我有一个基于 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.

为什么这不起作用?

谢谢。

简答:-stdlib=libstdc++ 调用 clang++,tr1 headers 就会出现。

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

从 macOS 10.12 Sierra 开始,默认值为 libc++ 并且 libstdc++ 已弃用。 libstdc++ 很旧,v4.2.1,早于 C++11(因此 tr1 headers)。如果您要维护此代码 long-term,那么值得花时间使其符合 C++11(即 #include <tuple>

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