当前位置: 首页 > article >正文

CMake学习笔记(三):静态库,动态库的生成和使用

一:动态库

接下来我们简单的讲解下动态库的建立和使用:在后面的项目的开发过程中,我们使用第三方库或者我们跑这个项目的时候我们总会看到一些.so的文件,这些就是所谓的动态库,里面的内容就是编译后的源文件,是程序运行时被加载和链接的代码库。并且可以独立更新,且因为可以被多个程序共享同一个动态库,所以动态库也被成为共享库。

还是那个例子,我们直接把cpp文件编译成.so文件:

#行注释
#[[块注
释]]
cmake_minimum_required(VERSION 3.0)#指定最低cmake版本的命令
project("cmake_learn")#定义工程名称
#--------------------------------------------------------------------------------
# aux_source_directory(src SRC_LIST)
file(GLOB_RECURSE SRC_LIST
    "src/*.cpp"
)
include_directories(./include)
message("SRC_LIST is " ${SRC_LIST})
#生成静态库/动态库
add_library(MyShare SHARED ${SRC_LIST})
#通过set函数设置编译器的版本
set(CMAKE_CXX_STANDARD 11)#增加c++11的标准 CMAKE_CXX_STANDARD是内置变量 所以可以在cmake的时候直接通过参数进行指定 cmake /path/to/cmakelists.txt -DCMAKE_CXX_STANDARD=11

我们借用上一节提到的file方式找到所有的源文件后,将源文件通过add_library来生成一个动态库名字为MyShare。

# PUBLIC:在public后面的库会被Link到前面的target中,并且里面的符号也会被导出,提供给第三方使用
# PRIVATE:在private后面链接的库只能被link前面的库中,并且被终结。第三方不能感知你调用啥库
# INTERFACE:在interface后面引入的库不会被链接到前面的库中,只会导出符号

#动态库的链接具体传递性
# 如果各个动态库之间没有依赖的关系,无需做任何设置,PUBLIC,PRIVATE,INTRERFACE没有啥区别,一般使用默认的PUBLIC即可。
#如果动态库A链接了动态库B,C动态库D链接了动态库A,此时动态库D相当于也链接了动态库B,并可以使用动态库B,C中定义的方法。
# target_link_libraries(A B C)
# target_link_libraries(D A)

当我们编译了一个动态库之后我们可以尝试链接动态库,在次之前,我们可以把除了main.cpp之外的源文件都删除。

#行注释
#[[块注
释]]
cmake_minimum_required(VERSION 3.0)#指定最低cmake版本的命令
project("cmake_learn")#定义工程名称
#--------------------------------------------------------------------------------
# aux_source_directory(src SRC_LIST)
file(GLOB_RECURSE SRC_LIST
    "src/*.cpp"
)
include_directories(./include)
message("SRC_LIST is " ${SRC_LIST})
#生成静态库/动态库
# add_library(MyShare SHARED ${SRC_LIST})
#链接动态库的路径
link_directories(./build/)
link_libraries(MyShare)
add_executable(MyShare_lession2 ./main.cpp)#定义工程生成一个可执行文件
target_link_libraries(MyShare_lession2 PRIVATE MyShare)
#通过set函数设置编译器的版本
set(CMAKE_CXX_STANDARD 11)#增加c++11的标准 CMAKE_CXX_STANDARD是内置变量 所以可以在cmake的时候直接通过参数进行指定 cmake /path/to/cmakelists.txt -DCMAKE_CXX_STANDARD=11

这样我们就能编译并且链接上动态库了。

二:静态库

        在动态库中我们使用add_library(MyShare SHARED ${SRC_LIST})来生成动态库,那么我们把SHARED替换成STATIC就是生成静态库了。ok,我们试试:

#行注释
#[[块注
释]]
cmake_minimum_required(VERSION 3.0)#指定最低cmake版本的命令
project("cmake_learn")#定义工程名称
#--------------------------------------------------------------------------------
# aux_source_directory(src SRC_LIST)
file(GLOB_RECURSE SRC_LIST
    "src/*.cpp"
)
include_directories(./include)
message("SRC_LIST is " ${SRC_LIST})
#生成静态库/动态库
add_library(MyStatic STATIC ${SRC_LIST})
#通过set函数设置编译器的版本
set(CMAKE_CXX_STANDARD 11)#增加c++11的标准 CMAKE_CXX_STANDARD是内置变量 所以可以在cmake的时候直接通过参数进行指定 cmake /path/to/cmakelists.txt -DCMAKE_CXX_STANDARD=11

执行编译后,我们发现build目录下多了一个libMyStatic.a文件,这个.a的文件就是静态库。那么同样的,我们链接/使用静态库的方式也和动态库一样,只是库的名称和方式不一样:

#行注释
#[[块注
释]]
cmake_minimum_required(VERSION 3.0)#指定最低cmake版本的命令
project("cmake_learn")#定义工程名称
#--------------------------------------------------------------------------------
# aux_source_directory(src SRC_LIST)
file(GLOB_RECURSE SRC_LIST
    "src/*.cpp"
)
include_directories(./include)
message("SRC_LIST is " ${SRC_LIST})
link_directories(./build/)
link_libraries(MyStatic)
add_executable(MyStatic_lession2 ./main.cpp)
target_link_directories(MyStatic_lession2 PRIVATE MyStatic)
#通过set函数设置编译器的版本
set(CMAKE_CXX_STANDARD 11)#增加c++11的标准 CMAKE_CXX_STANDARD是内置变量 所以可以在cmake的时候直接通过参数进行指定 cmake /path/to/cmakelists.txt -DCMAKE_CXX_STANDARD=11

按上述内容写完cmakelists.txt后,执行cmake 最后会生成一个MyStatic_lession2 可执行文件,执行即可。


http://www.kler.cn/a/589337.html

相关文章:

  • Python基础入门掌握(十三)
  • Spring源码解析
  • 自然语言处理demo:基于Python的《三体》文本分析
  • 更轻量级的的Knf4j接口文档配置实战
  • 【Linux篇】环境变量与地址空间
  • C++ 类和对象----构造函数
  • 一个简单的RPC示例:服务端和客户端
  • 【算法day13】最长公共前缀
  • AI时代的软件测试该如何“破局”?
  • 【Qt】QWidget属性2
  • 【项目合集】基于ESP32的智能化妆柜
  • 【Azure 架构师学习笔记】- Azure Databricks (22) --Autoloader
  • 随笔小记-本人常用桌面应用(流程图-boardmix,截图-snipaste,文件比较-beyond compare,远程控制-向日葵,解压-360压缩)
  • 机试准备第18天
  • Python的类和对象(4)
  • 在Django模型中的Mysql安装
  • oracle 基础知识之 多表查询
  • JVM---Java 类生命周期与类加载机制
  • 电子电气架构 --- 智能电动汽车的品牌竞争转变
  • 【失败了】LazyGraphRAG利用本地ollama提供Embedding model服务和火山引擎的deepseek API构建本地知识库