预备工作:新建print.c print.h main.c三个文件夹 分别如下:
#include "print.h"
void main()
{
print();
}
in print file 1 #include <stdio.h> 2 void print() 3 { 4 printf("[in %s file %s fun %d line]\n",__FILE__,__func__,__LINE__); 5 } ~
1 #ifndef _PRINT_H_ 2 #define _PRINT_H_ 3 void print(void); 4 #endif
一)静态库制作
1,把xx.c文件编译成xx.o文件
[email protected]:~/myFile/static_shared_lib$ gcc -c print.c -o [email protected]:~/myFile/static_shared_lib$ ls main.c print.c print.h print.o
2 用ar工具将其编译成静态库文件(需要加-r参数)
[email protected]:~/myFile/static_shared_lib$ ar -r lib_print.a print.o ar: creating lib_print.a
3 调用静态库文件验证
[email protected]:~/myFile/static_shared_lib$ gcc main.c lib_print.a -o test [email protected]:~/myFile/static_shared_lib$ ./test [in print.c file print fun 4 line]
二)动态库的制作
1:把xxx.c编译成.o文件 (一定要加上fpic参数,用相对路径)
[email protected]:~/myFile/static_shared_lib$ gcc -fpic -c print.c -o print.o [email protected]:~/myFile/static_shared_lib$ ls main.c print.c print.h print.o
2 把xxx.o文件编译成动态库
[email protected]:~/myFile/static_shared_lib$ gcc -shared -o lib_print.so print.o [email protected]:~/myFile/static_shared_lib$ ls lib_print.so main.c print.c print.h print.o
3 编译 &运行
[email protected]:~/myFile/static_shared_lib$ gcc -o test main.c lib_print.so [email protected]:~/myFile/static_shared_lib$ ls lib_print.so main.c print.c print.h print.o test [email protected]:~/myFile/static_shared_lib$ ./test ./test: error while loading shared libraries: lib_print.so: cannot open shared object file: No such file or directory [email protected]:~/myFile/static_shared_lib$ ldd test linux-vdso.so.1 => (0x00007ffeb055d000) lib_print.so => not found libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f8fb1926000) /lib64/ld-linux-x86-64.so.2 (0x0000564584eeb000)
执行的时候出错 用ldd 分析其所依赖的动态库,发现
lib_print.so => not found
原因环境变量中无此动态库,解决方案 将此目录添加至环境变量中,便可以运行了
[email protected]:~/myFile/static_shared_lib$ pwd /home/book/myFile/static_shared_lib [email protected]:~/myFile/static_shared_lib$ export LD_LIBRARY_PATH=/home/book/myFile/static_shared_lib [email protected]:~/myFile/static_shared_lib$ ls lib_print.so main.c print.c print.h print.o test [email protected]:~/myFile/static_shared_lib$ ./test [in print.c file print fun 4 line]PS :在实际的开发过程中,我们经常会看到,比如gcc编译时会提示在某个文件,某个函数,某行有XXX 下面我们模仿写个宏
1 #include <stdio.h> 2 #define DEBUG_MOD 1 3 #ifdef DEBUG_MOD 4 #define DEBUG (printf("%s:%s:%d",__FILE__,__func__,__LINE__),printf) 5 #else 6 #define DEBUG 7 #endif 8 9 void main() 10 { 11 unsigned char i=100; 12 DEBUG("%s %d\n","hello world",i); 13 } ~函数输出结果:
[email protected]:~/myFile/static_shared_lib$ gcc main.c [email protected]:~/myFile/static_shared_lib$ ls a.out lib_print.so main.c print.c print.h print.o [email protected]:~/myFile/static_shared_lib$ ./a.out main.c:main:12hello world 100