当前位置: 首页 > 知识库问答 >
问题:

如何强制 clang 默认使用某些库?

常心水
2023-03-14

我通过以下步骤针对libc,libc abi,编译器-rt构建clang:

> < li>

为了下载(和更新)llvm和子项目,我使用了以下脚本:

svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm
cd llvm/tools
svn co http://llvm.org/svn/llvm-project/cfe/trunk clang
svn co http://llvm.org/svn/llvm-project/clang-tools-extra/trunk clang/tools/extra
svn co http://llvm.org/svn/llvm-project/lldb/trunk lldb
svn co http://llvm.org/svn/llvm-project/lld/trunk lld
svn co http://llvm.org/svn/llvm-project/polly/trunk polly
cd ../projects/
svn co http://llvm.org/svn/llvm-project/compiler-rt/trunk compiler-rt
svn co http://llvm.org/svn/llvm-project/libunwind/trunk libunwind
svn co http://llvm.org/svn/llvm-project/openmp/trunk openmp
svn co http://llvm.org/svn/llvm-project/libcxxabi/trunk libcxxabi
svn co http://llvm.org/svn/llvm-project/libcxx/trunk libcxx

首先,我使用 gcc 针对 libgcc 和 libstdc 构建 llvm、clang、libunwind,并将它们安装在 /usr/local 中。在以下所有步骤中,除了最后一个,我都使用这个新鲜的叮当/叮当

(我几乎可以肯定,这里没有一个步骤是多余的。)

在最后一步,我遇到了一个问题:我必须向链接器添加额外的参数(我将它们添加到CMAKE_EXE_LINKER_FLAGSCMAKE_SHARED_LINKER_FLAGS-lunwind-lc abi。此外,每次我在项目中使用 -stdlib= libc 和 compiler-rt(或者同样,CLANG_DEFAULT_CXX_STDLIB=libc CLANG_DEFAULT_RTLIB=compiler-rt)的结果 clang 时,我都必须一遍又一遍地这样做。很烦人。比如说Qt Creator生成的项目的CMakeList.txt应该手动或cmake-gui进行更正。

如何让< code>clang驱动在运行时自动指定这些选项给< code>ld?有没有类似于< code>RPATH的机制?或者有一些特定的CMake变量(在llvm构建过程之前指定)来实现期望的行为吗?

我可以使用RPATH吗?

当然,我不想制作一些像包装器(类似于clang-libc)这样的bash脚本来指定额外的参数。我希望库在clang二进制文件本身的某个地方进行硬编码。

共有1个答案

汪鸿志
2023-03-14

已经提出了几个变通方法。我最终得到了以下变通方法:

mkdir build
cd build
# backup:
cp -vaf /usr/local/lib/libc++.{a,so.1.0} /usr/local/lib/libc++abi.{a,so.1.0} /usr/local/lib/libunwind.{a,so.1.0} .
clang -shared -fPIC -pthread -o fuse.so -Wl,--whole-archive libc++.a libc++abi.a libunwind.a -Wl,--no-whole-archive -ldl -lm
ar x libc++.a
ar x libc++abi.a
ar x libunwind.a
ar rc fuse.a *.o
sudo chown root:root fuse.*
sudo cp -vaf fuse.so /usr/local/lib/
sudo ln -svf /usr/local/lib/libc++.so.1 /usr/local/lib/fuse.so
sudo cp -vaf fuse.a /usr/local/lib/
sudo mv -vf /usr/local/lib/libc++.a /usr/local/lib/libc++.a.bak
sudo ln -svf /usr/local/lib/libc++.a /usr/local/lib/fuse.a

它将所有使用的库(libclibc abilibunwind)合并到一个*.a*.so文件中。然后libc .a和libc .so被替换为(链接到)生成的组合文件,保存以前的版本以供可能的备份。

它非常适合我。

但这不是答案。也许有一天clang不会从盒子里就出现这样的问题。

 类似资料:
  • 我希望一些方法只对kotlin代码可见,而不是对Java代码可见。 例如,这里有一个方法,它只能在kotlin代码中调用,不能在Java代码中调用。

  • 当使用Approle Auth方法创建角色时,我会告诉Vault在一个测试策略下创建生成的令牌 我获得roleid和secretid:vault read auth/approle/role/test/role-id vault write-f auth/approle/role/test/secret-id并使用它生成令牌: 我得到一个生成的令牌,现在检查生成的令牌:

  • IntelliJ Idea使用作为所有导入的Gradle项目的默认Gradle位置: 我想在默认情况下对导入的Gradle项目使用< code >指定位置: 但是,不可能选择作为默认选项。 如何强制Idea对新的导入项目使用? 联系: IDEA以及如何禁用分级包装生成 对新项目使用本地梯度分布而不是包装

  • 我使用GridLayoutManager将项目垂直放置在回收器视图中。每个项目都有一个跨度。现在我希望一些项目结束当前行,所以下一个项目被放置在它下面的新行上。每个项目只能占用一个跨度,所以它们都是相同的宽度。 例子: 第[4]项将放在下一行,而不是第[3]项之后。第[3]项后的空间不得使用。 我试图使用SpanSizeLookup,但它的对我来说没有任何意义,任何值似乎都没有任何作用。 有人能提

  • 对于中继中的工作正常,但对于来自中继的,失败并显示错误消息(链接): 错误:未为此 lambda 函数捕获“此” 在命名空间范围内定义对两者都适用。 使用 lambda 捕获稍微修改的定义也适用于全局或本地范围。 哪个编译器是对的?

  • 我安装了php5.6.6作为apache 2.4模块。 当加载带有 因此,正如文档所建议的,我编辑了httpd.conf指向php.ini配置文件(在C:\php56中)。我还添加了C:\php56到PATH和PHPRC环境变量。 由于我在这个文件夹中没有任何php.ini文件,我复制并重命名了“php.ini生产”文件,并编辑了扩展路径。 当我再次显示页面时,它将保持空白。。。下面是“php--