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
部分详解
-L
指定头文件的搜索目录(路径)。-L
参数跟着的是库文件所在的目录名,且中间有无空格均可以。
- 指定当前路径为头文件的搜索路径
g++ -L .
-l
(小写的L)
-l
参数就是用来指定程序要链接的库,-l
参数紧接着
就是库名。那么库名跟真正的库文件名有什么关系呢?就拿数学库来说,他的库名是m,他的库文件名是libm.so或者libm.a,很容易看出,把库文件名的头lib和尾.so或.a去掉就是库名了。
注意:.a
和so
在同一文件夹下会优先连接动态库(也就是.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