如何为LLVM指定自定义stdlib目录

时间:2013-12-11 21:17:52

标签: clang library-path

我有使用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。如何禁用它?

3 个答案:

答案 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++.alibgcc.a的目录来填写自己的链接器路径,这些目录将取决于编译器的安装位置。

答案 2 :(得分:0)

-B--sysroot的组合为图书馆提供了诀窍。 -nostdinc-isystem-cxx-isystem的组合完成了包含的技巧。并非所有这些标志都由clang --help显示,其中一些是我从man gcc学到的,另一些则是阅读Clang源代码,还有一些是在线阅读。

-gcc-toolchain也有所不同,但它使用了奇怪的规则来查找库,禁止路径名组件中的符号链接等,所以我最终使用了上面的其他标志。