5

我有带有 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 使用 stdlib(例如libgcc)目录以外的目录/usr/lib/gcc/i486-linux-gnu/4.4?我想/tmp/mygccstd改用它。

它也在寻找/usr/lib/lib。我该如何禁用它?

4

3 回答 3

3

在我的系统上,我安装了 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将取决于您的编译器的安装位置。

于 2019-03-26T15:43:39.750 回答
1

这记录在 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。

于 2020-11-25T11:52:06.207 回答
-1

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

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

于 2013-12-16T20:46:22.230 回答