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

Clang 如何为LLVM指定自定义stdlib目录,clang,library-path,Clang,Library Path,我有LLVM 3.3和Clang,以及 $ /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

我有LLVM 3.3和Clang,以及

$ /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
中查找。如何禁用该功能?

-B
-sysroot
组合在一起,实现了库的功能。将
-nostinc
-isystem
-cxx-isystem
组合在一起,成功实现了包含。并非所有这些标志都通过
clang--help
显示,其中一些是我从
mangcc
中学到的,一些是阅读clang源代码的,还有一些是在线的


-gcc工具链也起到了作用,但它使用了奇怪的规则来查找库,不允许在路径名组件中使用符号链接等,因此我最终使用了上面的其他标志。

在我的系统上安装了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
的目录填写自己的链接器路径,这取决于编译器的安装位置。

这在libcxx文档中有说明:

clang++-std=c++17-stdlib=libc++-nostinc++\
-I/include/c++/v1\
-L/lib\
-Wl,-rpath,/lib\
test.cpp
将是
/../../../

这会阻止编译器使用系统动态库


我可以找到
-gcc工具链
标志,它改变了
程序:
库的部分:
。这个“答案”并不真正构成原始问题的解决方案,因为它真正说的是“我使用了一些标志”。我认为,样本工作解决方案是被接受的回答的最低要求。我同意你的观点,这个答案不包含样本工作解决方案。这个答案的优点在于,它揭示了哪些有用的标志(在100个标志中),也证明了用这些标志可以解决这个问题。我强烈不同意你的观点,这个答案实际上是说“我用了一些旗子”。这个答案实际上是有用的,而“我使用了一些标志”根本没有帮助。我不同意您的观点,即对于一个可接受的答案,示例工作解决方案应该是最低的。@pts,我的clang无法识别某些头文件,特别是
。但该程序在我的Mac上使用g++-5(自定义gcc)可以很好地编译。那么,我必须给出什么命令才能让它在g++-5正在搜索的路径中查找头文件呢?我有
g++-5-print search dirs
@manish_s的输出:我会尝试使用包含bits.stdc++.h目录的-I和/或-issystem。请注意,这个问题不是关于添加路径,而是关于隐藏默认(系统)路径,这与您的问题非常不同。你可能想单独问一下关于StackOverflow的问题。这是一个罕见的建议,它帮了我的忙。谢谢很简单,我想知道为什么您选择
-cxx isystem
而不是
-isystem
?就我所看到的问题而言,无论哪种方式都解决了它。我现在也在上找到了关于
-stdlibc++-isystem
的讨论,但使用它时由于没有找到
bits/c++config.h
,导致了一个致命错误。
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