一步一步学CMake 之 生成动态库和静态库

目录

1. 准备源文件

2. 创建目标库文件

3. 链接库文件

4. 静态库和共享库的区别


1. 准备源文件

包含:

CMakeLists.txt
Message.cpp
Message.hpp
hello-world.cpp

详见:

https://github.com/dev-cafe/cmake-cookbook/tree/master/chapter-01/recipe-03/cxx-objlib-example

2. 创建目标库文件

这次我们要将 Message.cpp 和 Message.hpp 这两个文件编译成一个静态库文件,而不是可执行文件,

更改CMakeLists.txt文件,创建一个新的目标文件:

add_library(message	
   STATIC
   Message.hpp
   Message.cpp
)

该命令会生成构建工具指令,用于将指定的源文件编译为库文件,第一个参数 message 是将要生成的库文件的名字,该库名可以在整个CMakeLists.txt中使用,而实际生成的库文件名字则会包含前缀(lib)和后缀,后缀取决于第二个参数是STATIC还是SHARED,还取决于操作系统。

命令详解见:add_library

3. 链接库文件

告诉CMake必须把库文件链接到可执行文件里

target_link_libraries(hello-world message)

该命令是将库文件链接到可执行文件里,这条命令能保证hello-world可执行文件能够正确地一来于 message库文件(库文件总是在可执行文件之前构建的)。

4. 静态库和共享库

下面命令中第二个参数STATIC是指生成静态库,如果要生成共享库,可以直接将其替换为SHARED关键词。

add_library(message STATIC Message.hpp Message.cpp)
add_library(message SHARED Message.hpp Message.cpp)

这里顺便简单提一下静态(函数)库和共享(函数)库的区别:

静态(函数)库是在程序编译时链接的,其实就是一个或多个目标文件的集合,用“.a”作为文件的后缀。

共享(函数)库中的函数是在当一个可执行程序在启动的时候被加载,共享(函数)库又叫动态(函数)库, 文件后缀是.so ,windows上叫动态加载函数库, 文件后缀是.dll

# set minimum cmake version
cmake_minimum_required(VERSION 3.5 FATAL_ERROR)

# project name and language
project(recipe-03 LANGUAGES CXX)

# generate an object library from sources
add_library(message-objs
  OBJECT
    Message.hpp
    Message.cpp
  )

# this is only needed for older compilers
# but doesn't hurt either to have it
set_target_properties(message-objs
  PROPERTIES
    POSITION_INDEPENDENT_CODE 1
  )

add_library(message-shared
  SHARED
    $<TARGET_OBJECTS:message-objs>
  )
set_target_properties(message-shared
  PROPERTIES
    OUTPUT_NAME "message"
  )

add_library(message-static
  STATIC
    $<TARGET_OBJECTS:message-objs>
  )
set_target_properties(message-static
  PROPERTIES
    OUTPUT_NAME "message"
  )

add_executable(hello-world hello-world.cpp)

target_link_libraries(hello-world message-static)
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CMake中,你可以使用add_library命令来设置生成动态静态。add_library命令用于创建一个新的目标,并指定的类型。 要生成动态,可以将add_library命令的第一个参数设置为的名称,然后将第二个参数设置为SHARED。例如: ```cmake add_library(mylib SHARED source1.cpp source2.cpp) ``` 上面的例子中,我们创建了一个名为mylib的动态目标,并将源文件source1.cpp和source2.cpp添加到该目标中。生成动态文件将具有与平台相关的扩展名(如.so、.dll或.dylib)。 要生成静态,可以将add_library命令的第一个参数设置为的名称,然后将第二个参数设置为STATIC。例如: ```cmake add_library(mylib STATIC source1.cpp source2.cpp) ``` 上面的例子中,我们创建了一个名为mylib的静态目标,并将源文件source1.cpp和source2.cpp添加到该目标中。生成静态文件将具有与平台相关的扩展名(如.a、.lib或.a)。 默认情况下,CMake将根据操作系统和构建配置(如Release或Debug)来决定使用动态还是静态。但你也可以使用set_target_properties命令来显式地指定目标生成类型。例如: ```cmake set_target_properties(mylib PROPERTIES LINKER_LANGUAGE CXX) ``` 上面的例子中,我们将目标mylib的链接器语言设置为C++,这将影响生成的类型。 总之,通过在add_library命令中使用SHARED或STATIC作为第二个参数,可以设置生成动态静态。你也可以使用set_target_properties命令来显式指定的类型。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值