【Tools】cmake之编写CMakeLists.txt示例
參考這個博客: cmake配置項目引用動態庫
編寫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})
生成靜態庫 libmylib.a :
add_library(mylib STATIC ${SOURCES})
生成動態庫 libmylib.so :
add_library(mylib SHARED test.cpp)
指定要生成的靜態庫(STATIC)或動態庫(SHARED),如果不指定,則根據BUILD_SHARED_LIBS選項是否打開來生成默認的版本,ON 生成動態庫,OFF 生成靜態庫
主項目指定庫頭文件路徑:
target_include_directories(${PROJECT_NAME} PUBLIC ${calc_INCLUDE_DIR})
注意: calc_INCLUDE_DIR來自cmake文件中定義的變量,方便下游使用
主項目鏈接庫:
target_link_libraries(${PROJECT_NAME} PUBLIC ${calc_LIBRARY})
例:target_link_libraries(demo PUBLIC test)
demo是可執行文件名 或者 庫名,該指令會在鏈接庫目錄(包括系統默認庫目錄和指定的自定義庫目錄)下搜索文件:
- Windows下會搜索test.lib文件;
- Linux下會搜索libtest.a和libtest.so
對于target_link_libraries() - 如果 target 是一個 library,該命令可以用來指定依賴本倉庫的 target 還需要鏈接另外的倉庫,用于解決循環依賴;
- 如果 target 是可執行文件,則該命令用于指定其需要鏈接的庫;
- 如果link的target已經include過XXX了,就不用再target_include_directories添加庫文件路徑了。
以下舉例一句一句說明:
# 代碼路徑 set(SOURCES_PATH ../../../src)glob_sources(TEST_NODE_SOURCES ${SOURCES_PATH}/pinecone/nodes/camera/lane_detection)#創建可執行程序,test_node就是生成的可執行文件名 add_executable(test_node ${TEST_SOURCES})#指定本節點動態庫頭文件路徑,即指定編譯 target 所需要的頭文件。PUBLIC 和 INTERFACE 具有依賴傳遞性,而 PRIVATE 沒有。: target_include_directories(test_node PUBLIC ${SOURCES_PATH})# 為可執行文件鏈接庫 target_link_libraries(test_node pinecone camera_common camera_rosap opencv tensorrt-pix2pix h265decoder)set_target_properties(test_node PROPERTIES LINK_FLAGS ${COMMON_LINK_FLAG})本例中target_link_libraries()是為可執行文件鏈接庫時,其中的一個庫camera_common庫是通過下面的命令生成的庫:
glob_sources(CAMERA_COMMON_SOURCES ${SOURCES_PATH}/pinecone/nodes/camera/common) add_library(camera_common ${CAMERA_COMMON_SOURCES}) target_include_directories(camera_common PUBLIC ${SOURCES_PATH}) target_link_libraries(camera_common pinecone opencv )若要測試動態鏈接是否成功,可以使用ldd指令查看:
ldd 二進制程序
總結
以上是生活随笔為你收集整理的【Tools】cmake之编写CMakeLists.txt示例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【opencv】21.图像处理为什么要归
- 下一篇: 【C++】37.为什么要使用Lambda