windows使用cmake開發C 注意事項記錄

2021-10-12 02:56:00 字數 3331 閱讀 3383

一,庫引用

在cmakelists.txt中配置opencv的頭檔案目錄和lib檔案即include_directories和target_link_libraries即可完成引用。

include_directories和target_link_libraries可都使用絕對路徑,避免出錯。用opencv_dir,$ ,$等來配置可能會出錯。

其他庫的引用同樣,只需在include_directoriestarget_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...