预备工作:新建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文件
book@www.100ask.org:~/myFile/static_shared_lib$ gcc -c print.c -o print.obook@www.100ask.org:~/myFile/static_shared_lib$ ls
main.c print.c print.h print.o
2 用ar工具将其编译成静态库文件(需要加-r参数)
book@www.100ask.org:~/myFile/static_shared_lib$ ar -r lib_print.a print.o
ar: creating lib_print.a
3 调用静态库文件验证
book@www.100ask.org:~/myFile/static_shared_lib$ gcc main.c lib_print.a -o test
k@www.100ask.org:~/myFile/static_shared_lib$ ./test
[in print.c file print fun 4 line]
二)动态库的制作
1:把xxx.c编译成.o文件 (一定要加上fpic参数,用相对路径)
book@www.100ask.org:~/myFile/static_shared_lib$ gcc -fpic -c print.c -o print.o
book@www.100ask.org:~/myFile/static_shared_lib$ ls
main.c print.c print.h print.o
2 把xxx.o文件编译成动态库
book@www.100ask.org:~/myFile/static_shared_lib$ gcc -shared -o lib_print.so print.o
book@www.100ask.org:~/myFile/static_shared_lib$ ls
lib_print.so main.c print.c print.h print.o
3 编译 &运行
book@www.100ask.org:~/myFile/static_shared_lib$ gcc -o test main.c lib_print.so
book@www.100ask.org:~/myFile/static_shared_lib$ ls
lib_print.so main.c print.c print.h print.o test
book@www.100ask.org:~/myFile/static_shared_lib$ ./test
./test: error while loading shared libraries: lib_print.so: cannot open shared object file: No such file or directory
book@www.100ask.org:~/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
原因环境变量中无此动态库,解决方案 将此目录添加至环境变量中,便可以运行了
book@www.100ask.org:~/myFile/static_shared_lib$ pwd
/home/book/myFile/static_shared_lib
book@www.100ask.org:~/myFile/static_shared_lib$ export LD_LIBRARY_PATH=/home/book/myFile/static_shared_lib
book@www.100ask.org:~/myFile/static_shared_lib$ ls
lib_print.so main.c print.c print.h print.o test
book@www.100ask.org:~/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 }
~
函数输出结果:
book@www.100ask.org:~/myFile/static_shared_lib$ gcc main.c
book@www.100ask.org:~/myFile/static_shared_lib$ ls
a.out lib_print.so main.c print.c print.h print.o
book@www.100ask.org:~/myFile/static_shared_lib$ ./a.out
main.c:main:12hello world 100