编译文件中原命令如下:
gcc -Wall -g -fpic -shared -o libiptraces.so iptraces.c
gcc -Wall -g -o p.out -I. -L. -liptraces nsprint.c
makefile关系到整个工程的编译规则,makefile定义了一系列的规则来制定,哪些文件需要先编译,
哪些文件后编译,甚至于进行更复杂的功能操作,同时好处是——“自动化编译”
MakeFlie编写规范:
目标:依赖文件
$^ 代表所有依赖文件
$@ 代表所有目标文件
$< 代表第一个依赖文件
% 代表通配符
@指令:屏蔽指令
定义变量(变量大写)
变量名=值1 值2 ...
使用变量 $(变量名)
gcc是linux下面的编译器,分为预处理->编译->汇编->链接
gcc选项如下:
-o 输出可执行文件
-c 编译生成目标文件
-g 输出调试信息
-O2 编译器优化级别 1-3
-Wall 警告选项 输出警告信息
-l 紧接着链接库 lpthread
-L 指定链接库的路径
-I 头文件路径
-shared 编译成动态链接库
-fPIC:-fPIC作用于编译阶段,告诉编译器产生与位置无关代码
(Position-Independent Code),则产生的代码中,没有绝对地址,
全部使用相对地址,故而代码可以被加载器加载到内存的任意 位置,
都可以正确的执行。这正是共享库所要求的,共享库被加载时,
在内存的位置不是固定的。
so其实就是shared object的意思
1.so文件是什么?
也是ELF格式文件,共享库(动态库),类似于DLL。
2.怎么生成以及使用一个so动态库文件?
编译:得到输出文件libs.o
gcc -fPIC -g -c s.c -o libs.o
链接:得到输出文件libs.so
gcc -g -shared -Wl,-soname,libs.so -o libs.so libs.o -lc