g++编译生成库或可执行文件

g++使用指令

常用指令

指令功能指令功能
-w关闭编译时的警告,也就是编译后不显示任何warning-Wall编译后显示所有警告
-W选项类似-Wall,会显示警告,但是只显示编译器认为会出现错误的警告-I(大写i)指定搜索头文件的目录
-l(小写L)指定库名字,如-lmath-L指定库文件的搜索路径

在编译一些项目的时候可以-W和-Wall选项一起使用。

编译流程

在这里插入图片描述

编译生成库

g++ one.cpp two.cpp three.cpp -fPIC -shared -o libtest.so

参考:用g++编译生成动态链接库 *.so 的方法

部分详解

-L

指定头文件的搜索目录(路径)。-L参数跟着的是库文件所在的目录名,且中间有无空格均可以。

  • 指定当前路径为头文件的搜索路径
g++   -L .

-l(小写的L)

-l参数就是用来指定程序要链接的库,-l参数紧接着就是库名。那么库名跟真正的库文件名有什么关系呢?就拿数学库来说,他的库名是m,他的库文件名是libm.so或者libm.a,很容易看出,把库文件名的头lib和尾.so或.a去掉就是库名了。
注意:.aso在同一文件夹下会优先连接动态库(也就是.so)。

实战

库文件libcsvlib.a生成后,我使用如下的命令去使用库编译生成一个可执行文件,但是出错了:

PS  g++ -L. -lcsvlib -I. .\test.cpp

错误内容,也就是找不到链接库

PS  g++ -L. -lcsvlib -I. .\test.cpp
xxx: undefined reference to `CSV::getAllData[abi:cxx11]()'
xxx: undefined reference to `CSV::~CSV()'
xxx: undefined reference to `CSV::~CSV()'
xxx: undefined reference to `CSV::getXYMatrixData[abi:cxx11](unsigned long long, unsigned long long, unsigned long long, unsigned long long)'
.....

经过几番尝试后使用如下,就编译成功了!

PS  g++ -L . -I . .\test.cpp  -lcsvlib

分析一下:
那么为社么呢?我们得理解一下编译流程:【 源文件预编译->预编译文件编译生成对象文件(*.obj,*.o)->链接生成可执行文件】,所以我们一般都是先将所有文件编译成对象文件或者库文件(实际上也是二进制的对象文件),然后再通过链接器链接。所以我个人的理解使用g++ -L. -lcsvlib -I. .\test.cpp ,实际上test.cpp还没有编译成对象文件所以编译不知道需要库中的哪些链接内容,所以得先编译源文件再指定链接的库。(个人理解不知道对不对,如有错误请指正!

Reference

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值