空白
分类: C/C++
2014-12-19 17:02:54
在编译过程中,编译器的报错和警告信息对于程序员来说是非常重要的信息,GCC包含完整的出错检查和警告提示功能,它可以帮助Linux程序员尽快找出错误的或潜在的错误代码,从而写过更优美的代码。GCC的编译器警告选项如下表:
在发生警告时取消编译操作,即将警告看作是错误
类型 |
说明 |
-Wall |
启用所有警告信息 |
-Werror |
在发生警告时取消编译操作,即将警告看作是错误 |
-w |
禁用所有警告信息 |
下面看一段代码,使用GCC编译,同时开启警告信息:
对上面的代码进行编译连接:
$ gcc -Wall example3.c -o example3
example3.c:2:6: 警告: ‘main’的返回类型不是‘int’ [-Wmain]
从上面的输出看到,GCC给出了警告信息,意思是main函数的返回值被声明为void,但实际应该是int。
此外,GCC还提供了许多以-W开头的选项,允许用户指定输出某个特定的警告,例如:
下面使用GCC编译一段程序,来说明开启警告信息的必要性:
对上面的程序进行编译:
$ gcc example4.c -o example4
可以看到,编译并没有报错,运行可执行文件,输出结果为:
$ ./example4
134513689
这不是想要的输出结果,如果在上面的编译中加入-Wformat或-Wall选项,即:
$ gcc -Wformat example4.c -o example4
或
$ gcc -Wall example4.c -o example4
GCC给出如下警告信息:
example4.c: 在函数‘main’中:
example4.c:5:5: 警告: 格式 ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘double’ [-Wformat]
格式字符串和参数类型的不匹配会导致程序运行错误,所以这是是非常有用的警告选项。
下面使用GCC编译一段程序,使用-Wparentheses选项对其中的括号进行检查。
对上面的程序进行编译:
$ gcc -Wparentheses example5.c -o example5
example5.c: 在函数‘main’中:
example5.c:7:5: 警告: 建议在‘||’的操作数中出现的‘&&’前后加上括号 [-Wparentheses]
example5.c:11:7: 警告: 建议显式地使用花括号以避免出现有歧义的‘else’ [-Wparentheses]
所以GCC编译器的警告选项对程序员来说是非常重要的。
GCC编译器提供的连接器选项如下表:
向GCC的头文件搜索路径中添加新的目录
向GCC的头文件搜索路径中添加新的目录
类型 |
说明 |
-Idirectory |
向GCC的头文件搜索路径中添加新的目录 |
-Ldirectory |
向GCC的库文件搜索路径中添加新的目录 |
-llibrary |
提示连接程序在创建可执行文件时包含指定的库文件 |
-static |
强制使用静态链接库 |
-shared |
生成动态库文件 |
先来理解一下头文件和库文件这两个概念:
头文件包含变量和函数的声明,但没有定义函数的实现。函数的具体实现实在库文件中完成的,库文件可分为静态库和动态库,静态库是指编译连接时,将库 文件的代码全部加入到可执行文件中,这样运行时就不需要库文件了。静态库的后缀名一般为“.a”。动态库是指在编译连接时并不将库文件的代码加入到可执行 文件中,而是在程序执行时由运行时连接文件加载库文件,这样可以节省系统的开销。动态库的后缀名一般为“.so”。
例如我们编译是用-I选项来指定头文件的路径:
$ gcc example.c –o example –I/home/xxx/include
头文件所对应的库文件,如果没有特别指定时,GCC会到默认的搜索路径进行查找。
使用-L选项来指定库文件的路径,例如:
$ gcc example.c –o example –L/home/xxx/lib
GCC编译器在默认情况下使用动态库,但如果使用了-static选项,连接器将忽略动态库,强制使用静态链接库,即使用如下命令:
$ gcc example.c –o example –static –lm
此时静态库文件中的代码全部包含到可执行文件中,所以生成的可执行文件比较大。
原文地址:www.cnblogs.com/iuices/archive/2011/12/28/2305362.html