如何配置 GCC 默认显示所有警告?
How to configure GCC to show all warnings by default?
我认为如果默认打开 -Wall
标志会很好,也不会太坏。我该如何配置 GCC?
除了当您从源代码编译一些大型程序时大量警告会淹没您的终端之外,这还有什么缺点吗?
juzzlin 建议一个好的方法是为 gcc 编写一个包装器。 Marc Glisse 还建议写一个是实现我想要的最好方法。这就是我所做的。
我制作了一个 bash 脚本来为我调用 gcc:
#!/bin/sh
echo -n "Compiling ..."
gcc -Wall -Werror -o $(basename .c).out
a=$?
if [[ "$a" -eq 1 ]]; then
echo "Failed!"
else
echo "Done."
echo "Executing:"
./$(basename .c).out
fi
然后我将脚本复制到 /usr/bin
并使其可执行:
sudo cp car /usr/bin
chmod +x /usr/bin/car
(脚本名称是car
,代表"Compile And Run")
所以每当我想编译一个源文件并 运行 它时,我会输入:
car mysourcefile.c
如果您使用 bash 作为 shell.
,请将这些行添加到您的 ~/.bashrc
alias gcc='gcc -Wall'
更新:
这个问题可以参考https://superuser.com/questions/519692/alias-gcc-gcc-fpermissive-or-modifying-configure-script
如果使用 make,则需要从 .bashrc 中覆盖 make 的变量 CC 和 CXX:
export CC="gcc -wall"
export CXX="g++ -wall"
正如评论中所讨论的(虽然这不是对您问题的直接回答),使用 Makefile 有很多好处。它提供了一个放置构建命令的地方,如果您只使用 make
构建,它将始终保持最新状态。它还简化了每次构建时的 运行ning 测试。
Writing tests is a good habit,即使您只是在为家庭作业编写一小段无关紧要的代码。它可以让您发现一些您可能会错过的愚蠢错误,并确保您不会通过修改现有代码(尤其是最后一分钟的修改)来破坏现有代码。
一个这样的 Makefile 的 example(这里除了测试之外我没有什么可以构建的,因为它只是一个头文件组件):
all:
g++ -O2 -Wall -Werror -std=c++11 test_polynomial.cc -o test_polynomial -lgmp
g++ -O2 -Wall -Werror -std=c++11 test_g2polynomial.cc -o test_g2polynomial
./test_polynomial --log_level=test_suite
./test_g2polynomial --log_level=test_suite
clean:
rm -f test_polynomial test_g2polynomial
注意:这个例子不是一个很好的例子,因为我什至没有分解 CFLAGS
中的构建选项。如果我想添加一个标志,我必须在两个命令中都添加它!
另一个好处是您总是 运行 make
进行构建,无论使用何种语言、依赖项甚至构建系统(在使用 scons 或其他构建系统处理项目时,我仍然编写一个 Makefile 来执行我在构建和测试时执行的所有命令!)。
这允许我个人添加(但这里我们完全偏离主题):我有一个名为 autobuild
looping on make each time I write a file in vim. I code in screen and run autobuild
in a small window at the bottom of my screen 的构建脚本。这样,每次更改都会在我编写文件后立即构建和测试。
我认为如果默认打开 -Wall
标志会很好,也不会太坏。我该如何配置 GCC?
除了当您从源代码编译一些大型程序时大量警告会淹没您的终端之外,这还有什么缺点吗?
juzzlin 建议一个好的方法是为 gcc 编写一个包装器。 Marc Glisse 还建议写一个是实现我想要的最好方法。这就是我所做的。
我制作了一个 bash 脚本来为我调用 gcc:
#!/bin/sh
echo -n "Compiling ..."
gcc -Wall -Werror -o $(basename .c).out
a=$?
if [[ "$a" -eq 1 ]]; then
echo "Failed!"
else
echo "Done."
echo "Executing:"
./$(basename .c).out
fi
然后我将脚本复制到 /usr/bin
并使其可执行:
sudo cp car /usr/bin
chmod +x /usr/bin/car
(脚本名称是car
,代表"Compile And Run")
所以每当我想编译一个源文件并 运行 它时,我会输入:
car mysourcefile.c
如果您使用 bash 作为 shell.
,请将这些行添加到您的 ~/.bashrcalias gcc='gcc -Wall'
更新:
这个问题可以参考https://superuser.com/questions/519692/alias-gcc-gcc-fpermissive-or-modifying-configure-script
如果使用 make,则需要从 .bashrc 中覆盖 make 的变量 CC 和 CXX:
export CC="gcc -wall"
export CXX="g++ -wall"
正如评论中所讨论的(虽然这不是对您问题的直接回答),使用 Makefile 有很多好处。它提供了一个放置构建命令的地方,如果您只使用 make
构建,它将始终保持最新状态。它还简化了每次构建时的 运行ning 测试。
Writing tests is a good habit,即使您只是在为家庭作业编写一小段无关紧要的代码。它可以让您发现一些您可能会错过的愚蠢错误,并确保您不会通过修改现有代码(尤其是最后一分钟的修改)来破坏现有代码。
一个这样的 Makefile 的 example(这里除了测试之外我没有什么可以构建的,因为它只是一个头文件组件):
all:
g++ -O2 -Wall -Werror -std=c++11 test_polynomial.cc -o test_polynomial -lgmp
g++ -O2 -Wall -Werror -std=c++11 test_g2polynomial.cc -o test_g2polynomial
./test_polynomial --log_level=test_suite
./test_g2polynomial --log_level=test_suite
clean:
rm -f test_polynomial test_g2polynomial
注意:这个例子不是一个很好的例子,因为我什至没有分解 CFLAGS
中的构建选项。如果我想添加一个标志,我必须在两个命令中都添加它!
另一个好处是您总是 运行 make
进行构建,无论使用何种语言、依赖项甚至构建系统(在使用 scons 或其他构建系统处理项目时,我仍然编写一个 Makefile 来执行我在构建和测试时执行的所有命令!)。
这允许我个人添加(但这里我们完全偏离主题):我有一个名为 autobuild
looping on make each time I write a file in vim. I code in screen and run autobuild
in a small window at the bottom of my screen 的构建脚本。这样,每次更改都会在我编写文件后立即构建和测试。