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

目录

1. 准备源文件

2. 创建目标库文件

3. 链接库文件

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


1. 准备源文件

包含:

  1.  
    CMakeLists.txt
  2.  
    Message.cpp
  3.  
    Message.hpp
  4.  
    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文件,创建一个新的目标文件:

  1.  
    add_library(message
  2.  
       STATIC
  3.  
       Message.hpp
  4.  
       Message.cpp
  5.  
    )

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

命令详解见:add_library

3. 链接库文件

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

target_link_libraries(hello-world message)

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

4. 静态库和共享库

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

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

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

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

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

  1.  
    # set minimum cmake version
  2.  
    cmake_minimum_required(VERSION 3.5 FATAL_ERROR)
  3.  
     
  4.  
    # project name and language
  5.  
    project(recipe-03 LANGUAGES CXX)
  6.  
     
  7.  
    # generate an object library from sources
  8.  
    add_library(message-objs
  9.  
    OBJECT
  10.  
    Message.hpp
  11.  
    Message.cpp
  12.  
    )
  13.  
     
  14.  
    # this is only needed for older compilers
  15.  
    # but doesn't hurt either to have it
  16.  
    set_target_properties(message-objs
  17.  
    PROPERTIES
  18.  
    POSITION_INDEPENDENT_CODE 1
  19.  
    )
  20.  
     
  21.  
    add_library(message-shared
  22.  
    SHARED
  23.  
    $<TARGET_OBJECTS:message-objs>
  24.  
    )
  25.  
    set_target_properties(message-shared
  26.  
    PROPERTIES
  27.  
    OUTPUT_NAME "message"
  28.  
    )
  29.  
     
  30.  
    add_library(message-static
  31.  
    STATIC
  32.  
    $<TARGET_OBJECTS:message-objs>
  33.  
    )
  34.  
    set_target_properties(message-static
  35.  
    PROPERTIES
  36.  
    OUTPUT_NAME "message"
  37.  
    )
  38.  
     
  39.  
    add_executable(hello-world hello-world.cpp)
  40.  
     
  41.  
    target_link_libraries(hello-world message-static)
原文地址:https://www.cnblogs.com/lidabo/p/13846916.html