MacPorts clang 不使用它自己的 headers
MacPorts clang not using its own headers
我正在尝试让 emscripten 在 OS X 10.8 上工作,请参阅 this post 以了解那里的一些相关问题。显然 Xcode 附带的 clang++
版本太旧了,所以我使用 MacPorts 得到了最近的 clang 3.7.0。我什至告诉 CMake 使用那个编译器(在命令行上传递 -DCMAKE_CXX_COMPILER=clang++-mp-3.7
),但它仍然失败:
[ 33%] Building CXX object CMakeFiles/optimizer.dir/parser.cpp.o
/opt/local/bin/clang++-mp-3.7 -std=c++11 -fno-exceptions -fno-rtti -O3 -DNDEBUG
-o CMakeFiles/optimizer.dir/parser.cpp.o
-c …/emsdk/emscripten/master/tools/optimizer/parser.cpp
In file included from …/emsdk/emscripten/master/tools/optimizer/parser.cpp:2:
In file included from …/emsdk/emscripten/master/tools/optimizer/parser.h:12:
…/emsdk/emscripten/master/tools/optimizer/istring.h:3:10: fatal error:
'unordered_set' file not found
#include <unordered_set>
^
1 error generated.
我可以通过从命令行启动编译器来重现该问题。在并行构建模式下,有时它会抱怨 <cstdint>
而不是 optimizer.cpp
。这两个 headers 都存在于 /opt/local/libexec/llvm-3.7/include/c++/v1/
.
中
- 使用
clang++
的 macports-installed 版本(包括其 headers)的规范方法是什么?我必须使用 -I
并计算出完整路径,还是有更短的路径?
- 我是否可以安全地这样做而不将运行时库也切换到 MacPorts 的 clang 附带的库?如果没有,我能否以某种方式将运行时库的完整路径编码到创建的二进制文件中,无论是针对单个库还是使用
ld
的 -rpath
参数或一些等效的替代方法?
更新: 当我在手动指定包含目录后尝试 link 东西时,我得到未解析的符号,我不知道如何解决这个问题。来自 MacPorts 的 libcxx
包除了自述文件外是空的。
我已经通过将 CXXFLAGS=--stdlib=libc++
添加到环境中解决了最初的问题。那么即使是系统版本的 clang 也会做我需要的一切。该标志对 MacPorts 版本的 clang
也有神奇的作用:指定我获得了成功的构建,我什至可以验证(使用 -E
编译器开关)它正在使用 headers我之前提到过。不过,我仍然不确定是否有任何东西可以确保 headers 与系统的 libc++
版本相匹配。
我正在尝试让 emscripten 在 OS X 10.8 上工作,请参阅 this post 以了解那里的一些相关问题。显然 Xcode 附带的 clang++
版本太旧了,所以我使用 MacPorts 得到了最近的 clang 3.7.0。我什至告诉 CMake 使用那个编译器(在命令行上传递 -DCMAKE_CXX_COMPILER=clang++-mp-3.7
),但它仍然失败:
[ 33%] Building CXX object CMakeFiles/optimizer.dir/parser.cpp.o
/opt/local/bin/clang++-mp-3.7 -std=c++11 -fno-exceptions -fno-rtti -O3 -DNDEBUG
-o CMakeFiles/optimizer.dir/parser.cpp.o
-c …/emsdk/emscripten/master/tools/optimizer/parser.cpp
In file included from …/emsdk/emscripten/master/tools/optimizer/parser.cpp:2:
In file included from …/emsdk/emscripten/master/tools/optimizer/parser.h:12:
…/emsdk/emscripten/master/tools/optimizer/istring.h:3:10: fatal error:
'unordered_set' file not found
#include <unordered_set>
^
1 error generated.
我可以通过从命令行启动编译器来重现该问题。在并行构建模式下,有时它会抱怨 <cstdint>
而不是 optimizer.cpp
。这两个 headers 都存在于 /opt/local/libexec/llvm-3.7/include/c++/v1/
.
- 使用
clang++
的 macports-installed 版本(包括其 headers)的规范方法是什么?我必须使用-I
并计算出完整路径,还是有更短的路径? - 我是否可以安全地这样做而不将运行时库也切换到 MacPorts 的 clang 附带的库?如果没有,我能否以某种方式将运行时库的完整路径编码到创建的二进制文件中,无论是针对单个库还是使用
ld
的-rpath
参数或一些等效的替代方法?
更新: 当我在手动指定包含目录后尝试 link 东西时,我得到未解析的符号,我不知道如何解决这个问题。来自 MacPorts 的libcxx
包除了自述文件外是空的。
我已经通过将 CXXFLAGS=--stdlib=libc++
添加到环境中解决了最初的问题。那么即使是系统版本的 clang 也会做我需要的一切。该标志对 MacPorts 版本的 clang
也有神奇的作用:指定我获得了成功的构建,我什至可以验证(使用 -E
编译器开关)它正在使用 headers我之前提到过。不过,我仍然不确定是否有任何东西可以确保 headers 与系统的 libc++
版本相匹配。