一步一步学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)

猜你喜欢

转载自blog.csdn.net/wanzew/article/details/104101121