通过makefile传递gcc标志

时间:2009-08-09 04:24:28

标签: gcc makefile llvm

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

  在制作共享对象时,不能使用

对“本地符号”重新定位R_X86_64_32;用-fPIC重新编译

通过谷歌搜索错误消息找到修复程序后,我发现这不是llvm特有的。一些解决方案建议我在运行configure时应该使用“--enable-shared”,但这对我的情况没有帮助。现在我想使用fPIC重新构建llvm,正如错误所说。但是如何使用makefile执行此操作?

3 个答案:

答案 0 :(得分: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放在编译器标志中。

答案 1 :(得分:5)

如果您确信您应该在任何地方使用“-fPIC”(或“-m32”或“-m64”,我需要更频繁地使用),那么您可以使用'特技':

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

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

答案 2 :(得分:1)

另一个选择是直接传递-fPIC,以下列方式:

make CFLAGS='-fPIC' CXXFLAGS='-fPIC'