我有使用Clang的LLVM 3.3和
$ /tmp/clang/bin/clang -print-search-dirs
programs: =/tmp/clang/bin:/usr/lib/gcc/i486-linux-gnu/4.4/../../../../i486-linux-gnu/bin
libraries: =/tmp/clang/bin/../lib/clang/3.3:/usr/lib/gcc/i486-linux-gnu/4.4:/usr/lib/gcc/i486-linux-gnu/4.4/../../../../lib32:/usr/lib/../lib32:/usr/lib/i486-linux-gnu/../../lib32:/usr/lib/gcc/i486-linux-gnu/4.4/../../..:/lib:/usr/lib
如何指示Clang使用除libgcc
以外的stdlib(例如/usr/lib/gcc/i486-linux-gnu/4.4
)目录?我想改为使用/tmp/mygccstd
。
它还会查看/usr/lib
和/lib
。如何禁用它?
答案 0 :(得分:2)
这在libcxx文档中有记录:
clang++ -std=c++17 -stdlib=libc++ -nostdinc++ \
-I<libcxx-install-prefix>/include/c++/v1 \
-L<libcxx-install-prefix>/lib \
-Wl,-rpath,<libcxx-install-prefix>/lib \
test.cpp
<libcxx-install-prefix>
将是<location of clang binary>/../../
这将阻止编译器使用系统dylib。
答案 1 :(得分:1)
在我的系统上,我安装了3个编译器。 gcc-7.3.0,gcc-7.2.0和clang-6.0
gcc-7.3.0已安装到系统路径,并且是系统默认的编译器。
gcc-7.2.0已安装到/ usr / local,并且是特定工具的构建要求。
clang-6.0已安装到/ usr / local,并用于更严格的警告/错误。
我的boost库是使用gcc-7.2.0编译的,我希望使用clang来编译我的特定工具。默认情况下,使用-stdlib=libstdc++
时,clang将找到gcc-7.3.0,boost将无法链接。
要解决这个问题,我使用了以下编译标志:
-stdlib=libstdc++ # Tell clang to parse the headers as libstdc++ not libc++
-cxx-isystem /usr/local/include/c++/7.2.0/ # includes for libstdc++
-cxx-isystem /usr/local/include/c++/7.2.0/x86_64-pc-linux-gnu/ # includes for libstdc
以及以下链接器标志:
-L/usr/local/lib64/ # static libstdc++
-L/usr/local/lib/gcc/x86_64-pc-linux-gnu/7.2.0/ #static libgcc
您可以使用包含libstdc++.a
和libgcc.a
的目录来填写自己的链接器路径,这些目录将取决于编译器的安装位置。
答案 2 :(得分:0)
-B
和--sysroot
的组合为图书馆提供了诀窍。 -nostdinc
,-isystem
和-cxx-isystem
的组合完成了包含的技巧。并非所有这些标志都由clang --help
显示,其中一些是我从man gcc
学到的,另一些则是阅读Clang源代码,还有一些是在线阅读。
-gcc-toolchain
也有所不同,但它使用了奇怪的规则来查找库,禁止路径名组件中的符号链接等,所以我最终使用了上面的其他标志。