cmake配置項目引用動態庫

note#

  • 本文將介紹使用FIND_PACKAGE配置項目動態庫的方法
  • cmake version: 3.18
  • platform: win10 20H2

概述#

  • 創建了一個動態庫,再由主項目調用該動態庫。
  • find<lib庫名>.cmake的內容是: 1.定義動態庫的頭文件所在路徑 2. 定義庫所在路徑
  • 寫好cmake文件後,也可以方便給其他人調用,省卻了編寫的麻煩

目錄結構#

Copy Highlighter-hljs
.
│  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目錄下,內容如下

Copy Highlighter-hljs
# 指定庫頭文件所在路徑
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版本#

Copy Highlighter-hljs
cmake_minimum_required(VERSION 3.18)

指定項目名#

Copy Highlighter-hljs
PROJECT(lib_demo)

將主項目src文件夾下的所有源文件拷貝到變量demo_src#

Copy Highlighter-hljs
aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/src demo_src)

指定 cmake搜索庫路徑#

Copy Highlighter-hljs
set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)

重點來了,項目引用動態庫#

重點來了,項目引用動態庫#

重點來了,項目引用動態庫#

Copy Highlighter-hljs
FIND_PACKAGE(calc REQUIRED)

創建可執行程序#

Copy Highlighter-hljs
add_executable(${PROJECT_NAME} ${demo_src})

主項目指定動態庫頭文件路徑#

Copy Highlighter-hljs
target_include_directories(${PROJECT_NAME} PUBLIC ${calc_INCLUDE_DIR})

注意: calc_INCLUDE_DIR來自cmake文件中定義的變量,方便下游使用

主項目連接動態庫#

Copy Highlighter-hljs
target_link_libraries(${PROJECT_NAME} PUBLIC ${calc_LIBRARY})

拷貝動態庫到可執行目錄下#

Copy Highlighter-hljs
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#

Copy Highlighter-hljs
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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章