目錄
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)
