一. 常用编译命令选项 假设源程序文件名为test.c。 1. 无选项编译链接 用法:#gcc test.c 作用:将test.c预处理、汇编、编译并链接形成可执行文件。这里未指定输出文件,默认输出为a.out。 2. 选项 -o 用法:#gcc test.c -o test 作用:将test.c预处理、汇编、编译并链接形成可执行文件test。-o选项用来指定输出文件的文件名。 3. 选项 -E 用法:#gcc -E test.c -o test.i 作用:将test.c预处理输出test.i文件。 4. 选项 -S 用法:#gcc -S test.i 作用:将预处理输出文件test.i汇编成test.s文件。 5. 选项 -c 用法:#gcc -c test.s 作用:将汇编输出文件test.s编译输出test.o文件。 6. 无选项链接 用法:#gcc test.o -o test 作用:将编译输出文件test.o链接成最终可执行文件test。 7. 选项-O 用法:#gcc -O1 test.c -o test 作用:使用编译优化级别1编译程序。级别为1~3,级别越大优化效果越好,但编译时间越长。 二. 多源文件的编译方法 如果有多个源文件,基本上有两种编译方法: [假设有两个源文件为test.c和testfun.c] 1. 多个文件一起编译 用法:#gcc testfun.c test.c -o test 作用:将testfun.c和test.c分别编译后链接成test可执行文件。 2. 分别编译各个源文件,之后对编译后输出的目标文件链接。 用法: #gcc -c testfun.c //将testfun.c编译成testfun.o #gcc -c test.c //将test.c编译成test.o #gcc testfun.o test.o -o test //将testfun.o和test.o链接成test 以上两种方法相比较,第一中方法编译时需要所有文件重新编译,而第二种方法可以只重新编译修改的文件,未修改的文件不用重新编译。 三、gcc编程环境基础--编译时头文件和库文件路径指定 ※预处理(preprocessing),编译(compilation),汇编(assembly)和连接(linking) ※include的header文件,连结数据库,系统定义,总共有下列来源指定gcc去那找: 当初在编译时指定的(在~gcc/gcc/collect2.c:locatelib() 写在specs内的 后来用-D -I -L指定的 gcc环境变量设定(编译的时候) ld.so的环境变量(这是run time的时候) 1.头文件 gcc在编译时怎么去寻找所需要的头文件 : ※header file的搜寻会从-I开始 ※然后找gcc的环境变量 C_INCLUDE_PATH,CPLUS_INCLUDE_PATH,OBJC_INCLUDE_PATH ※再找内定目录 /usr/include /usr/local/include /usr/lib/gcc-lib/i386-linux/2.95.2/include /usr/lib/gcc-lib/i386-linux/2.95.2/include/g++-3 /usr/lib/gcc-lib/i386-linux/2.95.2/i386-linux/include 2.库文件 cos()等函式库的选项要多加 -lm 编译的时候: ※gcc会去找-L ※再找gcc的环境变量LIBRARY_PATH ※再找内定目录 /lib /usr/lib /usr/local/lib 3.利用Linux系统上已有的研发库 (1).查看库文件提供了哪些调用 能用nm命令自己查看库文件提供了哪些调用 (2).通过头文件查看函数的定义 Wc -l 查看文件的内容 Gcc 预编译技术首先将头文件解析成临时文件,在某个源代码文件需要时,再读入该临时文件。可以用g++单独编译一个头文件。 编译阶段主要进行源代码的完整性检测,然后将代码翻译成汇编语言,而汇编阶段主要进行汇编代码向目标代码的翻译。 4.函数库分为: 静态库:后辍一般为.a。 动态库:共享库,.so(share object),一般格式为*.so.x,x为版本。 |
|