静态库 动态库制作详解 +调试宏

  预备工作:新建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



猜你喜欢

转载自blog.csdn.net/DMC111qwf/article/details/80268157
今日推荐