gcc共享库和静态链接库

来源:互联网 发布:希区柯克 为什么 知乎 编辑:程序博客网 时间:2024/05/16 19:15

gcc共享库和静态链接库

(一)gcc常用命令

  • -v /–v/ –version 查看gcc版本
  • -c 只编译,生成.o文件,不链接
  • -I 指定头文件目录,注意-I和后面之间没有空格
  • -g 包含调试信息
  • -On n=0~3 编译优化,n越大优化的越多
  • -wall 提示更多警告信息
  • -D 编译时定义宏,D和后面没有空格
  • -E 生成预处理文件
  • -M 生成.c文件与头文件依赖关系以用于MakeFile,包括系统的头文件
  • -MM 生成.c文件与头文件依赖关系以用于MakeFile,不包含系统的头文件

(二)静态库和共享库

  • gcc -fPIC -c a.c
  • gcc -fPIC -c b.c
  • gcc -shared -Wl -o libmyab.so a.o b.o
  • gcc -shared -Wl, -soname,libmyab.so.1 -o libmyab.so.1.0.1 a.o b.o

  • 静态库与共享库的区别

    这里写图片描述
    静态库在编译时一块连接到app,而共享库只是记录符号表和依赖的共享库版本。静态库缺点是生成的可执行文件较大,优点是生成的app可以单独执行。共享库的优点是文件体积较小,缺点是执行程序时需要加载共享库一块执行。

  • 共享库命名

    这里写图片描述
    在共享库libmycalc.so.1.10中1是大版本号,10是小版本号。so name是程序运行时检查本地共享库的名字,只要大版本号一致程序就可以运行。link name是编译连接阶段时使用的,方便维护MakeFile文件。

1.静态库案例

文件目录初始状态为
这里写图片描述
执行gcc -c -fPIC *.c 生成.o文件
这里写图片描述
执行ar rcs libmycal.a *.o 生成静态库libmycal.a,然后将libmycal.a拷贝到lib文件夹
这里写图片描述
gcc main.c lib/libmycal.a -o app 生成可执行程序app
./app 执行app

2.共享库案例

1.执行gcc -c -fPIC *.c生成.o文件
2.执行gcc -shared -Wl,-soname,libmycal.1 -o libmycal.so.1.10 *.o生成共享库 libmycal.so.1.10
3.将共享库 libmycal.so.1.10拷贝到lib文件夹
这里写图片描述
4.执行gcc main.c lib/libmycal.so.1.10 -o app生成可执行文件app

此时执行./app会出错
这里写图片描述
原因是app程序无法找到共享库,执行sudo vim /etc/ld.so.conf命令在配置文件中加入共享库的路径。接着执行sudo ldconfig -v更新配置文件,然后再执行gcc main.c lib/libmycal.so.1.10 -o app命令生成可执行文件app。

5.执行ln -s libmycal.so.1.10 libmycal.so生成link name

0 0
原创粉丝点击