通过makefile传递gcc标志

通过makefile传递gcc标志,gcc,makefile,llvm,Gcc,Makefile,Llvm,我正在尝试使用构建一个pass,并且我已经完成了构建llvm及其相关组件的工作。但是,当我在完成了构建过程(包括)的所有步骤之后运行make时,我得到以下结果 创建共享对象时,不能使用针对“本地符号”的重新定位R_X86_64_32;用-fPIC重新编译 在通过谷歌搜索错误消息找到修复方法后,我知道这不是llvm特有的。一些解决方案建议我在运行configure时使用“-enable shared”,但这对我的情况没有帮助。现在我想使用fPIC重新构建llvm,正如错误所说的那样。但是如何使用m

我正在尝试使用构建一个pass,并且我已经完成了构建llvm及其相关组件的工作。但是,当我在完成了构建过程(包括)的所有步骤之后运行make时,我得到以下结果

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


在通过谷歌搜索错误消息找到修复方法后,我知道这不是llvm特有的。一些解决方案建议我在运行configure时使用“-enable shared”,但这对我的情况没有帮助。现在我想使用
fPIC
重新构建llvm,正如错误所说的那样。但是如何使用makefile实现这一点呢?

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

export CFLAGS="$CFLAGS -fPIC"
export CXXFLAGS="$CXXFLAGS -fPIC"
看,这些会被捡起来用的。奇怪的是,它一开始就不在那里

编辑:


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

如果您适度确信应该在任何地方使用“
-fPIC
”(或“
-m32
”或“
-m64
”,我需要更频繁地使用),然后你可以使用“技巧”:

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

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

另一个选项是通过以下方式直接传递-fPIC以进行编译:

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

你的例子适用于简单的案例。但是当您在makefile中定义了一个CFLAGS时,它将被覆盖,假设您的makefile包含类似于
$(CC)$(CFLAGS)
的内容,+=复合运算符不就是为了这个吗?