• 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
    
    • 1

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

    部分详解

    -L

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

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

    -l(小写的L)

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

    实战

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

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

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

    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)'
    .....
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

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

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

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

    Reference

  • 相关阅读:
    上海00后985毕业女生月薪1.2w,想找年薪40万程序员,网友表示很不理解
    自定义线程池拒绝策略
    Rust 语法
    Ajax的应用
    Spring Security即将弃用WebSecurityConfigurerAdapter配置类
    浏览器内写代码,微软发布 VS Code Server!
    远程代码执行漏洞
    GIGE 协议摘录 —— 引导寄存器(四)
    编译安装、RPM和tar包等安装方式的对比
    【MySQL】基本查询(三)聚合函数+group by
  • 原文地址:https://blog.csdn.net/weixin_43470971/article/details/127546961