如何查看哪些标志-march = native将激活?

我正在使用GCC 4.3编译我的C ++应用程序。而不是手动选择优化标志我正在使用
-march=native
,理论上应该添加适用于我正在编译的硬件的所有优化标志。但是我如何检查它实际使用的是哪些标志?     
已邀请:
您可以使用
-Q --help=target
选项:
gcc -march=native -Q --help=target ...
-v
选项也可能有用。 您可以在此处查看
--help
选项的文档。     
要查看命令行标志,请使用:
gcc -march=native -E -v - </dev/null 2>&1 | grep cc1
如果要查看编译器/预编译器定义由某些参数设置,请执行以下操作:
echo | gcc -dM -E - -march=native
    
它应该是(
-###
类似于
-v
):
echo | gcc -### -E - -march=native 
显示gcc的“真实”原生标志。 您可以使用命令使它们显得更“清晰”:
gcc -### -E - -march=native 2>&1 | sed -r '/cc1/!d;s/(")|(^.* - )//g'
你可以用-mno- *摆脱旗帜:
gcc -### -E - -march=native 2>&1 | sed -r '/cc1/!d;s/(")|(^.* - )|( -mno-[^ ]+)//g'
    
如果您想了解如何设置非本机交叉编译,我发现这很有用: 在目标机器上,
% gcc -march=native -Q --help=target | grep march
-march=                               core-avx-i
然后在构建机器上使用它:
% gcc -march=core-avx-i ...
    
我将把我的两分钱投入到这个问题中,并建议对伊莱亚斯的回答稍加冗长。从gcc 4.6开始,
gcc -march=native -v -E - < /dev/null
的运行以多余的
-mno-*
标志的形式发出越来越多的垃圾邮件。以下将删除这些:
gcc -march=native -v -E - < /dev/null 2>&1 | grep cc1 | perl -pe 's/ -mno-S+//g; s/^.* - //g;'
但是,我只是在两个不同的CPU(Intel Core2和AMD Phenom)上验证了这一点的正确性,所以我建议运行以下脚本以确保所有这些
-mno-*
标志都可以被安全地剥离。
#!/bin/bash

gcc_cmd="gcc"

# Optionally supply path to gcc as first argument
if (($#)); then
    gcc_cmd="$1"
fi

with_mno=$(
    "${gcc_cmd}" -march=native -mtune=native -v -E - < /dev/null 2>&1 |
    grep cc1 |
    perl -pe 's/^.* - //g;'
)
without_mno=$(echo "${with_mno}" | perl -pe 's/ -mno-S+//g;')

"${gcc_cmd}" ${with_mno}    -dM -E - < /dev/null > /tmp/gcctest.a.$$
"${gcc_cmd}" ${without_mno} -dM -E - < /dev/null > /tmp/gcctest.b.$$

if diff -u /tmp/gcctest.{a,b}.$$; then
    echo "Safe to strip -mno-* options."
else
    echo
    echo "WARNING! Some -mno-* options are needed!"
    exit 1
fi

rm /tmp/gcctest.{a,b}.$$
我没有发现
gcc -march=native -v -E - < /dev/null
gcc -march=native -### -E - < /dev/null
之间的区别,除了引用的一些参数 - 以及不包含特殊字符的参数,所以我不确定在什么情况下这会产生任何真正的区别。 最后,请注意
--march=native
是在gcc 4.2中引入的,在此之前它只是一个未被识别的参数。     

要回复问题请先登录注册