参考:《Linux C编程从基础到实践》
#######################################
静态库和动态库的区别
静态库是指编译链接时,将库文件的代码全部加入可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了,其后缀名通常为".a"。
动态库与之相反,在编译链接时并没有将库文件的代码加入可执行文件中,而是在程序执行时加载库,这样可以节省系统的开销。一般动态库的后缀名为".so"
note:gcc在编译时默认使用动态库
###########################################
gcc基本使用格式:
gcc [选项] 文件名
gcc通过选项对程序的生成进行全名控制,每个选项可以有多种取值
常用选项:
-c:仅对源文件进行编译,不链接生成可执行文件。在对源文件进行差错或只需产生目标文件时可以使用该选项
-o filename:将进过gcc处理过的结果保存为filename,这个结果文件可以是预处理文件、汇编文件、目标文件或者最终的可执行文件。假设被处理的源文件为 file1,如果这个选项被忽略,那么生成的可执行文件的默认名称为a.out;目标文件的默认名为file1.o;汇编文件的的默认名为file1.s;生成的预处理 文件发送到标准输出设备stdout
-g 或 -gdb:在可执行文件中加入调试信息,方便进行程序的调试。如果使用"-gdb"选项,表示加入gdb扩展的调试信息,以便使用gdb来进行调试
-O[0, 1, 2, 3]:对生成的代码进行优化,括号中的部分为优化级别,默认的情况为2级优化,0为不优化。优化和调试通常不兼容,同时使用"-g"和"-O"选项经常会使 程序产生奇怪的运行结果,所有不要同时使用"-g"和"-O"选项
note:gcc的命令选项可以组合使用,不过在使用时,每个命令选项都要有一个自己的连字符"-"。如果采用简写的方式,很可能使命令的含义完全不同。
#############################################
gcc应用实例
C语言源文件test.c:
#include <stdio.h> //声明库函数
int main(void)
{
printf("This is a gcc test!\n"); //输出一个字符串
return 0;
}
gcc -o test test.c
实际开发过程中经常遇到应用代码比较复杂的情况,此时采用主函数和其他函数放在不同文件中的方法。除了主程序外,每个函数都由函数声明(函数头)和函数实现(函数体)两部分组成。函数的声明一般放在头文件(.h)中,而函数的定义文件放在实现文件中(.c),gcc可以很容易地把多个源文件编译成目标代码并进行链接
test.c源代码如下:
#include <stdio.h>
void test_printf(void)
{
printf("This is a test from anthor.c!\n");
}
test.h源代码如下:
void test_printf(void);
main.c源代码如下:
#include <stdio.h>
#include "test.h"
int main(void)
{
printf("This is a gcc test!\n");
test_printf();
return 0;
}
gcc编译命令:
gcc -o main main.c test.c