note
- 本文將介紹使用FIND_PACKAGE配置項目動態庫的方法
- cmake version: 3.18
- platform: win10 20H2
概述
- 創建了一個動態庫,再由主項目調用該動態庫。
- find<lib庫名>.cmake的內容是: 1.定義動態庫的頭文件所在路徑 2. 定義庫所在路徑
- 寫好cmake文件后,也可以方便給其他人調用,省卻了編寫的麻煩
目錄結構
.
│ CMakeLists.txt # cmake的配置文件
│
├─build # 存放 cmake配置生成的文件
├─cmake
│ findcalc.cmake # 動態庫的cmake文件
│
├─ext # 第三方庫存放目錄
│ └─calc # 編寫的動態庫存放目錄
│ ├─dll # dll 文件所在目錄
│ │ └─debug # debug配置下生成的動態庫
│ │ calc.dll
│ │
│ ├─include # 動態庫頭文件所在路徑
│ │ calc_interface.h
│ │
│ └─lib # 動態庫的庫文件
│ calc.lib
│
└─src # 主項目的源文件
main.cc
動態庫已經寫好,下面開始編寫配置文件。
編寫 find<lib庫名>.cmake文件
正如上面的名字,我這里定義的是名為findcalc.cmake的文件,放在 cmake目錄下,內容如下
# 指定庫頭文件所在路徑
FIND_PATH(calc_INCLUDE_DIR calc_interface.h ${CMAKE_CURRENT_SOURCE_DIR}/ext/calc/include)
# 指定庫文件所在路徑
FIND_LIBRARY(calc_LIBRARY calc.lib ${CMAKE_CURRENT_SOURCE_DIR}/ext/calc/lib)
# 為了下游可以繼續使用
set(calc_FOUND FALSE)
if (calc_INCLUDE_DIR AND calc_LIBRARY)
set(calc_FOUND TRUE)
endif()
這個文件主要用於CMakeLists.txt中引用動態庫
編寫CMakeLists.txt
指定cmake版本
cmake_minimum_required(VERSION 3.18)
指定項目名
PROJECT(lib_demo)
將主項目src文件夾下的所有源文件拷貝到變量demo_src中
aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/src demo_src)
指定 cmake搜索庫路徑
set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
重點來了,項目引用動態庫
重點來了,項目引用動態庫
重點來了,項目引用動態庫
FIND_PACKAGE(calc REQUIRED)
創建可執行程序
add_executable(${PROJECT_NAME} ${demo_src})
主項目指定動態庫頭文件路徑
target_include_directories(${PROJECT_NAME} PUBLIC ${calc_INCLUDE_DIR})
注意: calc_INCLUDE_DIR來自cmake文件中定義的變量,方便下游使用
主項目連接動態庫
target_link_libraries(${PROJECT_NAME} PUBLIC ${calc_LIBRARY})
拷貝動態庫到可執行目錄下
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_directory
"${CMAKE_CURRENT_SOURCE_DIR}/ext/calc/dll/$<CONFIGURATION>"
$<TARGET_FILE_DIR:${PROJECT_NAME}>)
cmake配置結果
轉到 build目錄,執行cmake .. 即可生成對應的 VS解決方案
使用VS打開解決方案,並生成對應的可執行程序,同時可以看見 ,dll文件已經拷貝到生成的目錄下
- 生成前, 沒有debug目錄
- 生成后,debug目錄
完整的CMakeLists.txt
cmake_minimum_required(VERSION 3.18)
PROJECT(lib_demo)
# 2. to get all source files
aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/src demo_src)
set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
FIND_PACKAGE(calc REQUIRED)
if (calc_FOUND)
add_executable(${PROJECT_NAME} ${demo_src})
# 指定庫頭文件路徑
target_include_directories(${PROJECT_NAME} PUBLIC ${calc_INCLUDE_DIR})
# 指定庫名
target_link_libraries(${PROJECT_NAME} PUBLIC ${calc_LIBRARY})
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_directory
"${CMAKE_CURRENT_SOURCE_DIR}/ext/calc/dll/$<CONFIGURATION>"
$<TARGET_FILE_DIR:${PROJECT_NAME}>)
else()
message(status "its not found")
endif(calc_FOUND)