16

我正在尝试使用llvm构建通行证,并且我已经完成了 llvm 及其相关组件的构建。但是,当我按照所有步骤构建包含makefile的通行证后运行 make 时,我得到以下信息

制作共享对象时,不能使用针对“本地符号”的重定位 R_X86_64_32;使用 -fPIC 重新编译

在试图通过谷歌搜索错误消息找到修复后,我知道这不是 llvm 特有的。一些解决方案建议我应该在运行配置时使用“--enable-shared”,但这对我的情况没有帮助。现在我想使用 重新构建 llvm fPIC,如错误所示。但是我如何使用makefile来做到这一点?

4

3 回答 3

12

看起来您可以通过设置 shell 变量添加 -fPIC (对于与位置无关的代码,您想要的可以在任何地址加载的共享库):

export CFLAGS="$CFLAGS -fPIC"
export CXXFLAGS="$CXXFLAGS -fPIC"

查看Makefile.rules,这些将被拾取和使用。似乎很奇怪,它一开始就不存在。

编辑:

实际上,在 makefile 中阅读更多内容时,我找到了指向LLVM Makefile Guide的链接。在 Makefile.rules 中,在 Makefile 中设置 SHARED_LIBRARY=1 或 LOADABLE_MODULE=1(这意味着 SHARED_LIBRARY)会将 -fPIC 放入编译器标志中。

于 2009-08-09T04:42:10.770 回答
5

如果你有一定的把握应该-fPIC在任何地方都使用 ' '(或者 ' -m32' 或 ' -m64',我需要更频繁地使用它们),那么你可以使用 'trick':

CC="gcc -fPIC" ./configure ...

这假定一个 Bourne/Korn/POSIX/Bash shell 并gcc -fPIC在运行配置脚本之前将环境变量 CC 设置为 ' '。这(通常)确保所有编译都使用指定的标志完成。为了设置编译的正确“bittiness”,这有时比您发现的各种其他机制更好 - 编译很难绕开它,除非完全忽略您指定要使用的 C 编译器这一事实。

于 2009-08-09T05:32:40.467 回答
1

另一种选择是直接通过 -fPIC 进行 make 的方式如下:

make CFLAGS='-fPIC' CXXFLAGS='-fPIC'
于 2012-10-16T16:43:02.880 回答