如何使用 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 如果那真的不是一个选项。
我有一个基于 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 如果那真的不是一个选项。