Linux 平台GCC使用小结

gcc -Wall [-I search_headfile_path] [-L search_lib_path] sourcefile -lNAME -o exe-name

-Wall选项打开所有最常用到的编译警告----推荐你总是使用该选项!
-I 扩展头文件(Include)搜索路径
-L 扩展库文件(Library)搜索路径
-lNAME 编译器选项“-lNAME”试图链接标准库目录下的文件名为“libNAME.a”中的对象文件。

另外的也可以链接通过命令行或环境变量指定的目录下的库文件(见-L选项)。

其他:
1.链接次序:
在类Unix系统上,传统上编译器和链接器搜索外部函数的次序是在命令行上指定的对象文件中从左到右的查找(不会回过头再去找)。
这意味着,包含函数定义的库文件、源文件、对象文件应该出现在使用该函数的库文件、源文件、对象文件之后,否则将出现链接错误。

2.gcc搜索路径
默认情况下,gcc在下面目录中搜索头文件:
/usr/local/include/
/usr/include/
在下面目录中搜索库:
/usr/local/lib/
/usr/lib/
搜索头文件的目录列表常被称为include路径,而搜索库的目录列表被称为搜索路径或链接路径。在这些路径中的目录是按次序搜索的,在上面的两个列表中从第一个到最后一个。例如,“/usr/local/include”中找到的头文件优先于“/usr/include”中的同名文件。类似的,“/usr/local/lib”中找到的库优先于“/usr/lib”中的同名库。

3.gcc搜索路径优先次序:
-I > 环境变量 > 标准目录
-L > 环境变量 > 标准目录

1. 从左到右搜索由命令行“-I”和“-L”指定的目录
2. 由环境变量,比如C_INCLUDE_PATHLIBRARY_PATH,指定的目录
3. 默认的系统目录
在日常的使用情况中,通常用“-I”和“-L”选项把目录添加到搜索路径。

设置环境变量:
1> 修改.bash_profile文件(ubuntu为.profile) 设置后,需要注销,才能生效
2> 命令行(声明环境变量$NAME,并export NAME)设置后,仅对当前会话有效

4.共享库与静态库

在绝大部分系统上gcc编译程序时默认链接到共享库。使用选项“-lNAME”的情况下链接静态库。“libNAME”可以用于链接,但编译器首先会检查具有相同名字和“.so”为扩展名的共享库。当启动可执行文件时,载入器为了把共享库载入内存,必须先找到它。默认情况下,载入器仅在一些预定义的系统目录中查找共享库,比如“/usr/local/lib”和“/usr/lib”。如果库不在这些目录中,那它必须被添加到载入路径(load path)中去。

设置载入路径的最简单方法是通过环境变量LD_LIBRARY_PATH

使用“-static”选项可以迫使gcc静态链接,避免使用共享库:
$ gcc -Wall -static -I/opt/gdbm-1.8.3/include/ -L/opt/gdbm-1.8.3/lib/ dbmain.c -lgdbm

5.预处理:
“-DNAME”选项在命令行上定义预处理宏NAME。

“-D”命令行选项可以用来定义有值的宏,形式是“-DNAME=VALUE”。

“-E”选项,可以直接看到预处理器对源代码处理后的效果。

“-save-temps” 选项除了保存预处理过的“.i”文件外,还会保存“.s”的汇编文件和“.o”的对象文件。

6.带调试信息进行编译:
GCC提供了“-g”调试选项来在对象文件和可执行文件中存储另外的调试信息。方便gdb
等调试器跟踪。

GNU Bash shell中,命令ulimit –c可以控制设定core文件的最大值。如果这个限定值是零,则不会生成core文件。

$ ulimit -c unlimited #扩大core文件的大小限制,以便允许写入任何大小的core文件

上一篇:python之路模块与包


下一篇:Rocketmq-尝试理解