首先介绍一些gcc常用的选项:
选项 |
作用 |
-o |
产生目标(.i、.s、.o、可执行文件等) |
-c |
通知gcc取消链接步骤,即编译源码并在最后生成目标文件 |
-E |
只运行C预编译器 |
-S |
告诉编译器产生汇编语言文件后停止编译,产生的汇编语言文件扩展名为.s |
-Wall |
使gcc对源文件的代码有问题的地方发出警告 |
-Idir |
将dir目录加入搜索头文件的目录路径 |
-Ldir |
将dir目录加入搜索库的目录路径 |
-llib |
链接lib库 |
-g |
在目标文件中嵌入调试信息,以便gdb之类的调试程序调试 |
静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库;
静态库的生成:用myprint.h 和 myprint.c 生成静态库libmyprint.a,然后用main.c使用该静态库;
myprint.h
void myprint(int num);
myprint.c
#include <stdio.h> void myprint(int num) { printf("my num is %d\n", num); }
main.c
#include<stdio.h> #include "myprint.h" int main() { myprint(100); myprint(1000); return 0; }
第一步:生成myprint.o文件;使用命令,gcc -c myprint.c -o myprint.o
第二步:将生成的myprint.o文件打包成静态库myprint.a文件;使用命令 ar rcs libmyprint.a myprint.o
可以使用命令file 文件查看文件类型;使用命令nm 查看静态库中的函数名称;
此时已经生成了静态文件libmyprint,可以将myprint.c文件删除;myprint.o也没有用了,也删除;
第三步:使用生成的静态库;
如果直接输入命令gcc main.c -o main 会提示错误,没有链接静态库,所以会报错
用-l来链接静态库;输入命令gcc main.c -o main -lmyprint 结果还是报错,没有找到该库文件,应该指定库文件的路径;
用-L来指定当前路径;输入命令gcc main.c -o main -lmyprint -L.;运行成功,生成了可执行文件main,运行main正常;
如果我把myprint.h放在inc目录下,把myprint.c, main.c放在src目录下;将生成的静态库libmyprint.a放在lib目录下;将生成的可执行文件main放在bin目录下;
第一步:生成myprint.o文件到lib目录下;
第二步:生成myprint.a静态库文件到lib目录下;
此时myprint.c和myprint.o已经没有用了;
第三步:使用静态库生成可执行文件main到目录bin下;注意需要用-I指定头文件目录