【问题标题】:Passing a gcc flag through makefile通过 makefile 传递 gcc 标志
【发布时间】:2009-08-09 04:24:27
【问题描述】:

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

重定位R_X86_64_32 对'a local symbol' 在制作共享对象时不能使用;用 -fPIC 重新编译

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

【问题讨论】:

标签: gcc makefile llvm


【解决方案1】:

看起来您可以通过设置 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 放入编译器标志中。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      另一种选择是直接通过-fPIC来做如下方式:

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

      【讨论】:

      • 我试过了 :) 你的例子适用于简单的情况。但是,当您在 makefile 中定义了 CFLAGS 时,它将被覆盖,假设您的 makefile 包含类似 $(CC) $(CFLAGS) 的内容
      • 这不是 += 复合运算符的用途吗?
      猜你喜欢
      • 2021-06-21
      • 1970-01-01
      • 1970-01-01
      • 2011-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      相关资源
      最近更新 更多