【gcc/g++】2.实现三中不同编译方式(直接编译库 静态链接库 动态链接库)

工程结构

该项目工程结构如下:
在这里插入图片描述

test作为主函数调用a中的函数,a.hpp存放函数声明,a.cpp存放函数实现.

三大编译方式

1. 直接编译

  • 直接编译g++ test.cpp src/a.cpp -o test会报错,需要加编译参数编译如下:
g++ test.cpp src/a.cpp -Iinclude -o test
  • 这两个cpp在命令行中,顺序任意

运行即可

./test

2. 链接静态库

  1. 进入src目录cd src
  2. 汇编,生成a.o文件
g++ a.cpp -c -I../include -o a.o
  1. 生成静态链接库liba.a
ar rs liba.a a.o

意思是把a.o归档为liba.a的静态库文件
4. 回到主目录(上级目录)cd ..
5. 链接静态库,生成可执行文件test:
-Lsrc是静态链接库所在目录

g++ test.cpp -Iiclude -Lsrc -la -o test
  • -la 引入库a,但是它不在当前目录,因此-Lsrc即引入src目录下的liba.a
  • 还要输入头文件所在目录-Iinclude

然后就可以执行./test了成功

3. 链接动态库

  1. 进入src目录cd src
  2. 生成动态库liba.so
g++ a.cpp -I../include -fPIC -shared -o liba.so
#这条指令等价于下边两条命令
#gcc a.cpp -I../include -c -fPIC -o a.o
#gcc -shared -o liba.so a.o

-fPIC是与路径无关的一条指令
-shared表示生成成动态库文件
3. 回到主目录(上级目录)cd ..
4. 链接动态库,生成可执行文件test:
5.直接运行./test会报错,原理后边讲
正确运行静态库生成的可执行文件如下:

LD_LIBRARY_PATH=src ./test

动态链接库和其他二者区别

  • 其他二者都是在编译可执行文件的时候就将源码包含了进去
  • 动态链接库生成的可执行文件只是在执行的时候才去加载,
  • 因此动态链接库生成的文件小,但是执行的时候需要加入链接库的搜索路径LD_LIBRARY_PATH
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值