概述
- 本文將介紹cmak引入第三方庫debug和release不同配置。
Windows上,習慣將debug模式下生成的動態庫名后綴添加D 以作和release區分。cmake創建一個項目A,A引入動態庫B,cmake怎么配置A鏈接動態庫B的debug和release對應的庫呢 - 本文的教程是基於 這里, 如果沒有看,我推薦你先看下,再閱讀本文。
核心函數 target_link_libraries
就這一個核心函數,我通常使用它鏈接LIB。如下
add_executable(exam_lib ${exam_src})
# to link dynamic library
target_link_libraries(exam_calc ${PROJECT_NAME})
它還可以配置debug和release模式下的動態庫。
核心代碼
# -------------------------------------------------------------------------------------------
# 區分動態庫的debug和release
target_link_libraries ( ${PROJECT_NAME} PRIVATE
debug ${calc_LIBRARY_debug}
optimized ${calc_LIBRARY_release} )
就這一句,是不是簡單到爆炸。 其中。${calc_LIBRARY_debug} 是動態庫debug模式下的絕對路徑。 同理, ${calc_LIBRARY_release}是動態庫release模式下的絕對路徑。而他們的定義出現在 這里 提到的 findcalc.cmake文件中,
#指定庫頭文件所在路徑
FIND_PATH(calc_INCLUDE_DIR icalc.h ${CMAKE_CURRENT_SOURCE_DIR}/ext/calc/include)
#指定庫文件所在路徑
FIND_LIBRARY(calc_LIBRARY_release calc.lib ${CMAKE_CURRENT_SOURCE_DIR}/ext/calc/lib/release)
FIND_LIBRARY(calc_LIBRARY_debug calcD.lib ${CMAKE_CURRENT_SOURCE_DIR}/ext/calc/lib/debug)
# 為了下游可以繼續使用
set(calc_FOUND FALSE)
if (calc_INCLUDE_DIR AND calc_LIBRARY_release AND calc_LIBRARY_debug)
set(calc_FOUND TRUE)
endif()
上面使用find_package鏈接第三方庫。
一個不完整例子
# 創建項目
add_library( ${PROJECT_NAME} SHARED ${book_src} ${book_header})
# -------------------------------------------------------------------------------------------
# 指定頭文件搜索路徑
target_include_directories(${PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include)
target_include_directories(${PROJECT_NAME} PRIVATE ${calc_INCLUDE_DIR})
# -------------------------------------------------------------------------------------------
# 區分動態庫的debug和release
target_link_libraries ( ${PROJECT_NAME} PRIVATE
debug ${calc_LIBRARY_debug}
optimized ${calc_LIBRARY_release} )