Я собираюсь бросить свои два цента в этот вопрос и предложить немного более подробное продолжение ответа Элиаса.Начиная с 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;'
Однако, я проверил правильность этого только на двух разных процессорах (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, до чего это просто нераспознанный аргумент.