一,庫引用
在cmakelists.txt中配置opencv的頭檔案目錄和lib檔案即include_directories和target_link_libraries即可完成引用。
include_directories和target_link_libraries可都使用絕對路徑,避免出錯。用opencv_dir,$ ,$等來配置可能會出錯。
其他庫的引用同樣,只需在include_directories和target_link_libraries命令中分別配置庫的絕對路徑即可。
二,多個包相互依賴
比如下圖目錄結構:
base包和sock包都是作為共享庫,sock依賴base,dcm包依賴base和sock。
1)在根目錄的cmakelists.txt中配置
add_subdirectory(src/package/base)
add_subdirectory(src/package/sock)
add_subdirectory(src/package/dcm)
理解:add_subdirectory相當於將子目錄cmakelists.txt中的指令碼匯入到根目錄的cmakelists.txt,在根目錄的build資料夾下執行cmake ..的時候,cmake的source物件是根目錄的cmakelists.txt。
此時無論是在子目錄的cmakelists.txt中還是find***.cmake檔案中引用全域性變數cmake_source_dir,其值都是根目錄的路徑。而project_source_dir所指的是所在的cmakelists.txt的路徑。
2)配置find***.cmake檔案的路徑,在執行find_package時cmake會去cmake_module_path中的路徑中尋找包的cmake檔案
set(cmake_module_path $ $/cmake)
3)編寫find***.cmake
該檔案最基本的作用時定義包***的頭檔案目錄變數和lib檔案路徑變數,最簡單如下
message("***************===start find base package***************==")
if(not defined base_dir)
message("not define package dir ")
else()
message("package dir is $ ")
endif()
message("cmake src dir is $ ")
set(base_lib_dir "$/install/lib")
set(base_inc_dir "$/include")
if((not exists "$") or (not exists "$"))
message("this module include or lib path not exsit")
endif()
find_library(base_libs names base paths "$")
if(base_libs)
set(base_found true)
set(base_include_dirs $)
set(base_libraries $)
# mark_as_advanced(base_found base_include_dirs base_libraries)
else()
message("can not found lib")
endif()
上面時base包的cmake檔案,在dcm包的cmakelists.txt中就可以使用下面命令來引用base包
find_package(base)
include_directories($)
target_link_libraries($_lib public
$}
4)配置lib和exe安裝目錄,在根目錄cmakelists.txt中設定cmake_install_prefix包含的路徑
set(cmake_install_prefix $/install)
5)在子專案的cmakelists.txt配置targets的安裝路徑,如下
install(targets $
runtime destination lib
library destination lib
archive destination lib
)targets 可指定多個。
三,共享庫匯出
base和sock作為共享庫供dcm包使用,在base和sock的標頭檔案中,對於所有匯出函式,在函式前加_declspec(dllexport),如下:
對於所有匯出類,在類名前加上
#ifdef os_win
_declspec(dllexport)
#endif
如下:
以上對類和函式的新增都是在標頭檔案中,原始檔中不需要新增
四,包編譯
由於sock依賴base,dcm依賴base和sock,所以在用vs2019編譯及安裝時,順序依次是base,sock,dcm
1)在vs2019中,選擇"檢視"->"終端",執行如下
其中opencv_world3410d.dll是手動拷貝過來的,exe執行時需要
windows下cmake安裝使用
cmake是乙個跨平台的安裝 編譯 工具,可以用簡單的語句來描述所有平台的安裝 編譯過程 他能夠輸出各種各樣的makefile或者project檔案,能測試編譯器 所支援的c 特性,類似unix下的automake。只是 cmake 的組態檔 取名為 cmakelists.txt。cmake 並不直...
windows10下使用Shift 右鍵開啟cmd
由於換了新電腦,作業系統也由w7變成了w10。在用mysql的時候,發現原本shift 右鍵開啟的cmd變成了power shell,這個我實在用不慣,而且也比cmd佔記憶體,所以就網上搜了更改的方法,經過試驗也成功了。先建立乙個txt記事本,裡面輸入 windows registry editor...
cmake使用範例
cmake作為一款跨平台的專案構建工具,其使用範圍已經越來越廣,本文以實際專案為例,展示乙個使用該編譯工具的模板。希望我們都能在這些高效的工具幫助下都享受程式設計的樂趣。project src libs modules includes build bin cmakelists 根目錄下cmakel...