【问题标题】:How to specify a custom stdlib directory for LLVM如何为 LLVM 指定自定义 stdlib 目录
【发布时间】:2013-12-30 01:45:43
【问题描述】:

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

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

【问题讨论】:

  • 我可以找到-gcc-toolchain 标志,它改变了programs:libraries: 的一部分。

标签: clang library-path


【解决方案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 的目录填写您自己的链接器路径,这取决于您的编译器的安装位置。

【讨论】:

  • 这是很少见的建议,对我有用。谢谢。顺便说一句,我想知道你为什么选择-cxx-isystem而不是-isystem?对于我正在查看的问题,无论哪种方式都可以解决。我现在还在reviews.llvm.org/D64089 找到了关于-stdlibc++-isystem 的讨论,但是使用它给了我一个致命错误,因为找不到bits/c++config.h
【解决方案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

&lt;libcxx-install-prefix&gt; 将是 &lt;location of clang binary&gt;/../../

这会阻止编译器使用系统 dylib。

【讨论】:

    【解决方案3】:

    -B--sysroot 的组合对库起到了作用。 -nostdinc-isystem-cxx-isystem 的组合实现了包含的技巧。并非所有这些标志都是clang --help 显示的,其中一些是我从man gcc 那里学到的,一些是阅读Clang 源代码的,还有一些是在线的。

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

    【讨论】:

    • 这个“答案”并不真正构成对原始问题的解决方案,因为它真正说的是“我使用了一些标志”。我认为,一个示例工作解决方案是可接受响应的最低要求。
    • 我同意你的观点,这个答案不包含示例工作解决方案。这个答案的优点是它揭示了哪些有用的标志(在 100 个中),并且它也证明可以用这些标志解决它。我强烈不同意您的观点,即这个答案确实说“我使用了一些标志”。这个答案实际上很有帮助和有用,而“我使用了一些标志”根本没有帮助。我不同意您的观点,即样本工作解决方案应该是公认答案的最低要求。
    • @pts,我的 clang 无法识别某些头文件,特别是 &lt;bits.stdc++.h&gt;。但是该程序在我的 Mac 上使用 g++-5(自定义 gcc)编译得很好。那么确切地说,我必须给出什么命令才能让它在 g++-5 正在搜索的路径中查找头文件?我有g++-5 -print-search-dirs 的输出
    • @manish_s:我会在包含 bits.stdc++.h 的目录中尝试 -I 和/或 -isystem。请注意,这个问题不是关于添加路径,而是关于隐藏默认(系统)路径,这与您的问题非常不同。您可能想在 StackOverflow 上单独提出您的问题。
    猜你喜欢
    • 1970-01-01
    • 2013-03-06
    • 2016-12-11
    • 1970-01-01
    • 2011-02-24
    • 1970-01-01
    • 1970-01-01
    • 2011-04-30
    • 1970-01-01
    相关资源
    最近更新 更多