编译器中常见的编译选项

本文介绍了在使用GCC编译器时的一些常见选项,包括如何指定输出文件名、启用警告、遵循ANSI标准以及链接数学库。通过示例展示了如何通过编译选项解决编译过程中的问题,例如-Wall选项用于显示警告,-ansi-pedantic选项用于严格遵循ANSI标准,-lm选项用于链接数学库,以及-DDEBUG用于在编译时定义预处理宏。

安装好GCC后,又进一步研究了它的使用。

首先我建立了一个test.cpp的文件。放在电脑的F盘中。源代码如下:

# include <stdio.h>
main()
{
	int a,b;
	scanf("%d%d",&a,&b);
	int c = a+b;
	printf("%d%d\n",c);
	
}

在dos命令行中,编译一下:gcc test.c  程序没有输出,代表一切均好。检查目录(Windows 下用dir),会发现多了一个a.exe,这就是程序的编译结果。




下面的命令会让编译出的可执行程序名为 test.exe : gcc test.cpp -o test。

也许上面的源代码我们能一眼看出哪里出了错误,但当程序复杂时,就不一定了。这时,编译选项就能帮忙:gcc test.cpp -o test -Wall.

这下编译器就会指出3个警告:main 函数没有返回类型、没有返回值、printf的格式字符串可能有问题。




还有一些常用的编译选项:(不会用……╮(╯▽╰)╭写上先留着吧)

-ansi-pedantic:检查代码是否符合ANSI标准(-ansi只是判断是否和ANSI冲突,而-pedantic更加严格)。

它进一步指出了上述代码中的另一个“问题”:ANSI C中不允许临时声明变量,而必须在语句块的首部声明变量。

在C语言中,另一个常用的编译选项是-lm,它让编译器连接数学库,从而允许程序使用math.h中的数学函数。C++编译器会自动连接数学库,

但如果你的程序扩展名是.cpp,且不连接数学库,有时会有意想不到的结果。(啥结果啊(⊙o⊙)…??)

还有一个有用的选项是-DDEBUG,它在编译时定义符号DEBUG(可以换成其它,如-DLOCAL将定义符号LOCAL),这样,位于#ifdef DEBUG和#endif中间的语句会被编译。

而在通常情况下,这些语句将被编译器忽略(注意,不仅是不会执行,连编译都没有进行)。


要解决编译过程中由于编译器不支持 `-Wno-ignored-attributes` 选项而导致的错误,需要确保使用的编译器版本支持该选项。GCC 从版本 5 开始支持 `-Wno-ignored-attributes`,而 Clang 从版本 3.9 开始支持该选项。如果当前的编译器版本较低,可以通过升级编译器来解决此问题。 ### 升级 GCC 编译器 在 Ubuntu 上,可以通过以下步骤升级 GCC 编译器: 1. 添加 Ubuntu 工具链 PPA: ```bash sudo add-apt-repository ppa:ubuntu-toolchain-r/test sudo apt-get update ``` 2. 安装较新版本的 GCC: ```bash sudo apt-get install gcc-9 g++-9 ``` 3. 更新默认的 GCC 版本: ```bash sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 60 --slave /usr/bin/g++ g++ /usr/bin/g++-9 sudo update-alternatives --config gcc ``` ### 修改 CMakeLists.txt 文件 如果无法升级编译器,可以修改项目的 `CMakeLists.txt` 文件,以确保只在支持该选项编译器版本中启用: ```cmake if (CMAKE_CXX_COMPILER_ID MATCHES "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL "5.0") add_compile_options(-Wno-ignored-attributes) endif() ``` 保存文件后重新运行 CMake 配置和构建流程: ```bash mkdir build && cd build cmake .. make -j$(nproc) ``` ### 使用 Clang 编译器 如果使用 Clang 编译器,确保其版本不低于 3.9。可以通过以下命令安装较新版本的 Clang: ```bash sudo apt-get install clang-10 ``` 然后在构建时指定使用 Clang: ```bash CC=clang-10 CXX=clang++-10 cmake .. ``` 通过上述方法,可以确保编译器支持 `-Wno-ignored-attributes` 选项,从而避免编译过程中出现的错误[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值