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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM