【问题标题】:Can I change gcc default options without using command-line?我可以在不使用命令行的情况下更改 gcc 默认选项吗?
【发布时间】:2016-10-15 16:25:26
【问题描述】:

我被Gentoo bug #580414 困扰。 简而言之,默认选项会误导 configure 导致不检测标准包含文件,因为某些标头包含以下代码:

#if defined _FORTIFY_SOURCE && _FORTIFY_SOURCE > 0
# if !defined __OPTIMIZE__ || __OPTIMIZE__ <= 0
#  warning _FORTIFY_SOURCE requires compiling with optimization (-O)

,而__OPTIMIZE__默认关闭,_FORTIFY_SOURCE默认开启,生成的警告被认为是错误,表示“stdint.h”,“ stdlib.h" 和许多其他的不存在。编译最终失败,我无法安装程序甚至升级 gcc 本身。

我是否可以简单地在环境变量或 /etc 目录中添加一些东西来为 每次调用 gcc 时打开 -O 或关闭 _FORTIFY_SOURCE 而无需编辑 gentoo 构建脚本?

在 /etc/portage/make.conf 中试过

EPATCH_USER_EXCLUDE='*10_all_default-fortify-source*'
CFLAGS="-O2 -O -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0"
CFLAGS_FOR_BUILD="-O2 -O -U_FORTIFY_SOURCE"

没有任何改进。

【问题讨论】:

  • 使用/etc/portage/make.conf 设置所需的CFLAGS 和/或CXXFLAGS

标签: gcc configure gentoo


【解决方案1】:

没有这样的环境变量。 make.conf 中的 CFLAGS 不起作用,因为构建系统通常会执行以下操作:

    $(CC) $(CFLAGS) $(MY_HARDCODED_CFLAGS)

从而覆盖你的标志。

但要破坏传递给 gcc 的任何参数,您可以使用以下解决方法。

  1. 创建一个目录,例如。在/usr/local/bin/
  2. 创建一个脚本,它会根据需要修改其参数,然后将它们传递给gcc"/usr/bin/" + basename(argv[0])(注意无限递归)
  3. 使该脚本可执行
  4. 在该目录中创建指向脚本的符号链接,名称如gccccx86_64-pc-linux-gnu-gcc
  5. 将一堆这样的行放入/etc/portage/bashrc

    the_dir="/usr/local/bin/THE_DIR"
    if [[ "${PATH}" != *"${the_dir}"* ]] ; then
        export PATH="${the_dir}:${PATH}"
    fi
    

另外,为了避免将来可能出现的问题,请不要忘记在某处记录此更改。 (无论如何都应该使用任何解决方法。)

【讨论】:

  • 终于,一年后我可以重新编译 gcc (4.6->6.2)!您的建议令人大开眼界,但 configure 没有采用您建议的温和替换。我不得不重命名 /usr/bin/i686-pc-linux-gnu-g++ 本身(和朋友)。
【解决方案2】:

仅记录我实际用于解决问题的命令。

mv /usr/bin/i686-pc-linux-gnu-gcc /usr/bin/i686-pc-linux-gnu-gcc.OLD
cat >/usr/bin/i686-pc-linux-gnu-gcc
/usr/bin/i686-pc-linux-gnu-gcc.OLD -O "$@"

ctrl+D

chmod +x /usr/bin/i686-pc-linux-gnu-gcc
cp /usr/i686-pc-linux-gnu/gcc-bin/4.6.3/i686-pc-linux-gnu-gcc /usr/i686-pc-linux-gnu/gcc-bin/4.6.3/i686-pc-linux-gnuu-gcc
mv /usr/bin/i686-pc-linux-gnu-g++ /usr/bin/i686-pc-linux-gnuu-g++
cat >/usr/bin/i686-pc-linux-gnu-g++
/usr/bin/i686-pc-linux-gnuu-g++ -O "$@"

ctrl+D

chmod +x /usr/bin/i686-pc-linux-gnu-g++
cp /usr/i686-pc-linux-gnu/gcc-bin/4.6.3/i686-pc-linux-gnu-g++ /usr/i686-pc-linux-gnu/gcc-bin/4.6.3/i686-pc-linux-gnuu-g++
cp /etc/env.d/gcc/i686-pc-linux-gnu-4.6.3.O /etc/env.d/gcc/i686-pc-linux-gnuu-4.6.3

功劳归于rindeal。回顾:

  1. 确定作为编译器调用的二进制文件
  2. 重命名
  3. 创建以“-O”为前缀的 shell 脚本
  4. 创建一个 gcc 配置文件来安抚 gcc-config
  5. 出现所有笨重的包!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-13
    • 1970-01-01
    • 1970-01-01
    • 2016-04-15
    • 2019-06-15
    • 1970-01-01
    相关资源
    最近更新 更多