CMake常用指令

CMake文件符號的意思

Square Brackets [ ]
Angle Brackets < >

https://stackoverflow.com/a/23242584/22299707

建置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
cmake -S . -B build
cmake --build build -j 8
``````



# Linux下用pkg_check_modules尋找套件
```cmake
cmake_minimum_required(VERSION 3.15)
project(fy-version)

set(CMAKE_C_STANDARD 11)

find_package (PkgConfig REQUIRED)
pkg_check_modules(FYAML IMPORTED_TARGET libfyaml)
if (FYAML_FOUND)
include_directories(${FYAML_INCLUDE_DIRS})
link_directories(${FYAML_LIBRARY_DIRS})
list(APPEND LINK_LIB_LIST ${FYAML_LIBRARIES})

message(STATUS "found library:${FYAML_LIBRARIES}")
endif ()

# 建立執行檔
add_executable(fy-version yaml_reader.c)

target_link_libraries(${PROJECT_NAME} PkgConfig::FYAML)

https://cmake.org/cmake/help/latest/module/FindPkgConfig.html

https://stackoverflow.com/questions/42634710/how-to-use-pkg-config-in-cmake-juci

https://blog.csdn.net/zhizhengguan/article/details/111826697

Debug模式編譯

1
set(CMAKE_BUILD_TYPE Debug)

引用CUDA

Declare CUDA as a LANGUAGE in your project

1
project(GTC LANGUAGES CUDA CXX)
  • 連接library
    利用FindCUDAToolkit(cmake版本>3.17)
    1
    2
    3
    4
    5
    6
    find_package(CUDAToolkit)
    add_executable(
    binary_linking_to_cudart
    my_cpp_file_using_cudart.cpp
    )
    target_link_libraries(binary_linking_to_cudart PRIVATE CUDA::cudart)
    利用FindCUDAToolkit

https://cliutils.gitlab.io/modern-cmake/chapters/packages/CUDA.html

https://developer.download.nvidia.com/video/gputechconf/gtc/2019/presentation/s9444-build-systems-exploring-modern-cmake-cuda-v2.pdf

cmake 加入編譯好的.o檔

1
2
3
4
5
6
7
8
9
10
11
12
SET(OBJS
${CMAKE_CURRENT_SOURCE_DIR}/libs/obj.o
)

ADD_EXECUTABLE(myProgram ${OBJS} <other-sources>)

SET_SOURCE_FILES_PROPERTIES(
${OBJS}
PROPERTIES
EXTERNAL_OBJECT true
GENERATED true
)

https://stackoverflow.com/a/38610428

編譯不是cmake的專案或函式庫

1
2
3
4
5
6
7
8
9
10
ExternalProject_Add(Qt
DOWNLOAD_DIR ${CMAKE_CURRENT_BINARY_DIR}
URL ${qt_file}
UPDATE_COMMAND ""
SOURCE_DIR ${qt_source}
BUILD_IN_SOURCE 1
CONFIGURE_COMMAND ${qt_configure}
BUILD_COMMAND ${qt_build}
INSTALL_COMMAND "${qt_install}"
)

https://stackoverflow.com/a/3493578/22299707

編譯專案外的makefile專案資料夾

以下指令可以在外部資料夾下make指令

1
2
3
4
5
6
7
8
9
10
include(ExternalProject)
ExternalProject_Add(deepstreamapp
SOURCE_DIR ${DEEPSTREAMAPP}/sample_apps/deepstream-app # This is not likely to be CMAKE_CURRENT_LIST_DIR
CONFIGURE_COMMAND ""
INSTALL_COMMAND ""
DOWNLOAD_COMMAND ""
BUILD_COMMAND make
BUILD_IN_SOURCE true
)

接下來可以用以下指令找出所有編譯好的.o檔並且加到專案內

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
file(GLOB_RECURSE  DEEPSTREAMAPPCONFIGPARSER "/opt/nvidia/deepstream/deepstream/sources/apps/apps-common/src/deepstream-yaml/*.o")

SET(OBJS
${DEEPSTREAMAPPCONFIGPARSER}
)

SET_SOURCE_FILES_PROPERTIES(
${OBJS}
PROPERTIES
EXTERNAL_OBJECT true
GENERATED true
)

add_executable(${PROJECT_NAME}
${OBJS}
main.cpp
)

參考:https://discourse.cmake.org/t/external-project-using-makefile/2692/5

增加函式庫

https://cmake.org/cmake/help/latest/guide/tutorial/Adding%20a%20Library.html#step-2-adding-a-library
target_include_directories()target_link_libraries()

CMake教學系列三建立CMake專案

下載範例

下面指令將會下載本文所需的範例

1
2
git clone https://gitlab.com/CLIUtils/modern-cmake.git
cd modern-cmake/examples/simple-project/

CMakeLists.txt解說

  • 在第29行add_library(MyLibExample simple_lib.cpp simple_lib.hpp)增加了一個名為MyLibExampletarget並且將會編譯一個MyLibExamplelibrary
  • 第34行增加了一個add_executable(MyExample simple_example.cpp)增加了一個名為MyExampletarget並且將會編譯一個MyExample的執行檔
  • 第38行target_link_libraries(MyExample PRIVATE MyLibExample)連接了MyLibExampleMyExample這兩個target,注意你必須先製作target才能夠連接他們

建置專案、編譯

接下來你可以用以下指令建置專案並且編譯。CMake會產生一個build資料夾,在裡面你應該會看到libMyLibExample.alibrary和MyExample執行檔。你可以查看CMakeCache.txt看有哪些cache variable,接下來用./build/MyExample執行MyExample執行檔

1
2
cmake -S . -B build
cmake --build build -j 8

常見錯誤

路徑中有空白

1
set(VAR a b v)

這個寫法會讓VAR變成一個list,並且擁有a b c三個元素,因此如果你的路徑像這樣,你的路徑就會被拆成兩段。

1
2
set(MY_DIR "/path/with spaces/")
target_include_directories(target PRIVATE ${MY_DIR})

解決方法就是在${MY_DIR}外面再包一個引號

1
2
set(MY_DIR "/path/with spaces/")
target_include_directories(target PRIVATE "${MY_DIR}")

除錯

印出變數

雖然message指令也可以印出變數,不過你有更好的選擇,cmake_print_propertiescmake_print_variables,記得要先include(CMakePrintHelpers)。如此一來你可以更加容易的印出target的屬性

1
2
3
4
5
6
include(CMakePrintHelpers)
cmake_print_variables(MY_VARIABLE)
cmake_print_properties(
TARGETS my_target
PROPERTIES POSITION_INDEPENDENT_CODE
)

–trace-source 和 –trace-expand

--trace-source讓你可以指定只要看你想看的CMakeLists.txt--trace-expand變數全部展開,例如原本是

1
add_library(simple_lib ${SOURCES} ${HEADERS} )

加了--trace-expand變成

1
add_library(simple_lib simple_lib.c simple_lib.h )

下載這個範例,並且試看看cmake -S . -B build --trace-source=CMakeLists.txtcmake -S . -B build --trace-source=CMakeLists.txt --trace-expand有什麼不一樣

1
2
git clone git@github.com:hsf-training/hsf-training-cmake-webpage.git
cd hsf-training-cmake-webpage/code/04-debug

除錯CMake的find_…模組

沿用上面的範例,在這個範例你可以看到第16行有一個find_library(MATH_LIBRARY m)

1
2
git clone git@github.com:hsf-training/hsf-training-cmake-webpage.git
cd hsf-training-cmake-webpage/code/04-debug

試看看cmake -S . -B build --debug-find。記得要先清除build資料夾否會出現debug訊息。你也可以用CMAKE_FIND_DEBUG_MODE來針對你想要debug的find_…模組來除錯

1
2
3
set(CMAKE_FIND_DEBUG_MODE TRUE)
find_program(...)
set(CMAKE_FIND_DEBUG_MODE FALSE)

設定build types

如果你想要執行C++ debugger,你會需要設定很多flag,CMake提供四種build types來幫你設定這些flag。

  • CMAKE_BUILD_TYPE=Debug : 輸出所有除錯訊息
  • CMAKE_BUILD_TYPE=RelWithDebInfo : release build 不過有一些額外的除錯訊息
  • CMAKE_BUILD_TYPE=Release : 最佳化release build
  • CMAKE_BUILD_TYPE=MinSizeRel : minimum size release
    下面範例示範如何用CMake的Debug模式編譯,並且用GDB除錯
    1
    2
    3
    4
    cd hsf-training-cmake-webpage/code/04-debug
    cmake -S . -B build-debug -DCMAKE_BUILD_TYPE=Debug
    cmake --build build-debug
    gdb build-debug/simple_example
    GDB指令
    1
    2
    3
    4
    5
    # GDB                
    break my_sin
    r
    watch sign
    c

尋找套件

1
find_package(MyPackage 1.2)

這個命令會首先尋找CMAKE_MODULE_PATH這份路徑清單,在這些路徑底下尋找FindMyPackage.cmake這個檔案,注意他是直接把find_package第一個參數MyPackage產生出FindMyPackage.cmake這個搜尋目標,所以如果我們寫成find_package(OpenCV 3),那搜尋目標就是FindOpenCV.cmake
如果找不到FindMyPackage.cmake他就會接著尋找MyPackageConfig.cmake,如果MyPackage_DIR存在的話也會搜尋這個路徑。
在CMake3.12+之後,如果你的套件不是安裝在系統預設路徑,你可以設定環境變數<PackageName>_ROOT讓CMake搜尋。以下以Bash命令設定環境變數為例

1
export HDF5_ROOT=$HOME/software/hdf5-1.12.0

或者是設定CMAKE環境變數,以下以Bash命令設定環境變數為例

1
export CMAKE_PREFIX_PATH=$HOME/software/hdf5-1.12.0:$HOME/software/boost-1.74.0:$CMAKE_PREFIX_PATH

FindPackage.cmake

這是舊方法(MODULE方法),這裡有CMake提供的FindPackage清單

PackageConfig

這是由package開發者所提供,簡而言之如果你是package開發者,你應該提供<package>Config.cmake並且自行維護。

CMake結合PkgConfig

參考:
https://hsf-training.github.io/hsf-training-cmake-webpage/08-debugging/index.html

https://hsf-training.github.io/hsf-training-cmake-webpage/09-findingpackages/index.html

現代CMake觀念
https://pabloariasal.github.io/2018/02/19/its-time-to-do-cmake-right/

CMake結合PkgConfig
https://stackoverflow.com/a/74038236

CMake教學系列二 CMake的觀念

在第一篇我們已經學會如何編譯單一檔案的C++程式,接下來將介紹一些CMake的觀念

關於Targets

在CMake有兩種方式建立targettarget的名稱必須是唯一的

  • add_executable(myexample simple.cpp) : 建立了一個名為myexample的target,並且命名輸出的執行檔為myexample
  • add_library(mylibrary simplelib.cpp) : 建立了一個名為myexample的target,並且命名輸出的函式庫為myexample
    target很像程式裡面物件的概念,他擁有許多屬性,例如SOURCES在這個範例他會擁有simple.cpp這個檔案,target所有的屬性可以在這裡查到

特別的targets

有些C++函式庫只有標頭檔(例如函式庫Eigen),這種情況下你沒辦法真正的輸出一個library檔,但是他又被製作成target讓其他target使用。這種函式庫我們叫做interface libraries而再CMake我們可以用下面指令把他製作成target。注意到跟前面不同的是他只需要設為INTERFACE屬性而且他不需要輸入*.cpp檔。

1
add_library(some_header_only_lib INTERFACE)

另一種狀況是你要直接使用預先編譯好的pre-built library,這種情況你也不會有*.cpp可以給CMake編譯。這種library在CMake裡我們稱為imported library,我們可以用關鍵字IMPORTED來告訴CMake。

1
add_library(some_library STATIC IMPORTED)

連接

一旦你有了target就可以用target_link_libraries連接所需要的東西,連接的時候有PUBLIC, PRIVATE, 和 INTERFACE三種屬性可以選擇,他有點像程式語言中的存取控制。如果TargetB引用TargetA,則TargetA的PUBLIC屬性都會傳遞給TargetB。

範例1: Include directories

  • target_include_directories(TargetA PRIVATE mydir)連接TargetA和mydir資料夾屬性為PRIVATE,這時候TargetA的INCLUDE_DIRECTORIES屬性就會包含mydir資料夾
  • target_include_directories(TargetA INTERFACE mydir)連接TargetA和mydir資料夾屬性為INTERFACE,這時候TargetA的INTERFACE_INCLUDE_DIRECTORIES屬性就會包含mydir資料夾
  • target_include_directories(TargetA PUBLIC mydir)連接TargetA和mydir資料夾屬性為PUBLIC,則INCLUDE_DIRECTORIES INTERFACE_INCLUDE_DIRECTORIES都會包含mydir資料夾

CMake變數

為了方便起見,接下來的範例會直接執行example.cmake檔,而不是建立一個CMakeLists.txt。首先你需要先建立一個example.cmake,如果要執行example.cmake可以利用CMake的 -p 選項。這樣可以節省去許多編譯設定,也比較容易實驗

1
2
# Assuming you have a file called example.cmake:
cmake -P example.cmake

Local variables

example.cmake輸入以下指令,然後執行cmake -P example.cmake就可以看到終端機輸出你的變數。在這裡set指令設定變數,message指令印出變數,這裡我們使用的是STATUSmessage,還有其他的狀態你可以到官網查看

1
2
set(MY_VARIABLE "I am a variable")
message(STATUS "${MY_VARIABLE}")

{: file=’example.cmake’}

Cached variables

cached variables在CMake十分重要,通常我們會用CMake圖形介面或是CMake命令介面設定許多cached variables,這些變數都會被寫到CMakeCache.txt檔案裡面。當你執行CMake的時候CMake會先讀取這些Cached variables。下面這個範例會設定一個Cached variables,不過因為我們用-P執行*.cmake,所以不會真的輸出一個CMakeCache.txt,你可以參考上一篇的範例觀察CMake如何產生CMakeCache.txt

1
2
set(MY_VARIABLE "I am a variable")
message(STATUS "${MY_VARIABLE}")

{: file=’example.cmake’}
而因為Cached variables幾乎都是可以讓使用者設定的選項,所以有一個更方便的指令option

1
option(MY_OPTION "On or off" OFF)

Other variables

  • 你可以藉由$ENV{my_env}來取得環境變數my_env的值,你也可以利用if(DEFINED ENV{my_env})來檢查my_env這個環境變數是不是有被設定(注意這個指令沒有$)
  • target的屬性其實也是一種變數,你可以利用get_propertyset_property,或者是get_target_propertiesset_target_properties來查看和設定target屬性,除此之外還有CMake本身的屬性,可以從cmake-properties這份清單查詢。

Target properties and variables

你已經知道target的屬性可以控制target的行為,如果你仔細觀察會發現,有許多target屬性(例如CXX_EXTENSIONS)會有一個對應的CMake變數,並且以CMAKE_為開頭(例如CMAKE_CXX_EXTENSIONS),這些CMake變數是用來初始化對應的target屬性用的。因此你可以先設定這些CMake變數,這樣就可以快速設定target對應屬性的初始值。

搜尋工具

CMake有一些方便的glob指令可以用來處理string

1
file(GLOB OUTPUT_VAR *.cxx)

在這裡要提到一個很重要的flagCONFIGURE_DEPENDS(CMake 3.12+),如果沒有這個flag則在重新執行建置的時候,cmake不會再次用glob去搜尋,如此一來如果這些被搜尋的資料夾放入的新的檔案也不會被CMake發現。因此如果你想要在每一次建置專案的時候都重新搜尋,記得加上這個flag

1
file(GLOB OUTPUT_VAR *.cxx CONFIGURE_DEPENDS)

參考:
CMake Fundamentals Part 4
https://jeremimucha.com/2021/02/cmake-fundamentals-part4/

Modern CMake is like inheritance
https://kubasejdak.com/modern-cmake-is-like-inheritance

CMake doc : Importing Libraries
https://cmake.org/cmake/help/latest/guide/importing-exporting/index.html#importing-libraries

https://cliutils.gitlab.io/modern-cmake/chapters/basics.html

https://hsf-training.github.io/hsf-training-cmake-webpage/04-targets/index.html

https://hsf-training.github.io/hsf-training-cmake-webpage/05-variables/index.html

CMake教學系列一使用CMake編譯專案

安裝最新版的CMake,越新越好,因為新版的CMake提供更多的工具幫你尋找函式庫或套件,尤其如果你需要用到CUDA,新版的CMake可以省去你許多的麻煩
{: .prompt-tip }

安裝CMake

Ubuntu可以跟著這篇官方教學安裝最新的CMake

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
sudo apt-get update
sudo apt-get install ca-certificates gpg wget

test -f /usr/share/doc/kitware-archive-keyring/copyright ||
wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc 2>/dev/null | gpg --dearmor - | sudo tee /usr/share/keyrings/kitware-archive-keyring.gpg >/dev/null

# Ubuntu 20.04
echo 'deb [signed-by=/usr/share/keyrings/kitware-archive-keyring.gpg] https://apt.kitware.com/ubuntu/ focal main' | sudo tee /etc/apt/sources.list.d/kitware.list >/dev/null
sudo apt-get update

test -f /usr/share/doc/kitware-archive-keyring/copyright ||
sudo rm /usr/share/keyrings/kitware-archive-keyring.gpg

sudo apt-get install kitware-archive-keyring

sudo apt-get install cmake

嘗試用CMake編譯程式

讓我們嘗試用CMake編譯一個開源專案

1
2
git clone https://github.com/CLIUtils/CLI11.git # 下載專案
cd CLI11 #進入資料夾

然後我們就可以開始編譯,過程中你會發現CMake幫你建立了一個build資料夾,第一行指令-S表示source directoryB會幫你建立一個build資料夾如果他不存在的話,CMake產生的東西會全部放在build資料夾裡面,你隨時可以刪除他而且他也不需要被版本控制。第二行的-j讓你可以指定要用多少核心來加速編譯。第三行-t代表執行測試程式,如果你沒有測試程式也可以不需要這行指令。

1
2
3
cmake -S . -B build
cmake --build build -j 8
cmake --build build -t test

你很容易在網路上看到CMake傳統的編譯方式,不過在CMake 3.15之後你可以用前面提到的新的方法,他可以幫你處理掉一些小麻煩。

1
2
3
4
5
mkdir build
cd build
cmake ..
make
make test

{: .prompt-tip }

查看編譯選項

CLI11資料夾中,你可以用cmake -S . -L列出所有你可以設定的選項,有些是CMake內建的選項,有些是這著專案中設定讓你可以選的選項。cmake -S . -LH不但會列出所有選項,還把說明文字也印出來。在許多開源專案用CMake編譯的時候經常會需要知道他提供哪些選項,這個指令會非常有幫助。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
$ cmake -S . -B build -LH
-- CMake 3.22.1
-- Could NOT find Doxygen (missing: DOXYGEN_EXECUTABLE)
-- Doxygen not found, building docs has been disabled
-- Configuring done
-- Generating done
-- Build files have been written to: /home/steven/CLI11/build
-- Cache values
// Build the testing tree.
BUILD_TESTING:BOOL=OFF

// Path to a file.
Boost_INCLUDE_DIR:PATH=Boost_INCLUDE_DIR-NOTFOUND

// Turn on boost test (currently may fail with Boost 1.70)
CLI11_BOOST:BOOL=ON

// Build CLI11 examples
CLI11_BUILD_EXAMPLES:BOOL=ON

// Build CLI11 json example
CLI11_BUILD_EXAMPLES_JSON:BOOL=OFF

// Build the tests with NVCC to check for warnings there - requires CMake 3.9+
CLI11_CUDA_TESTS:BOOL=OFF

// Install the CLI11 folder to include during install process
CLI11_INSTALL:BOOL=OFF
...以下省略

如果你想要設定選項值,你可以在CMake指令中用-D加上選項名稱來設定,例如

1
cmake -DCLI11_INSTALL=ON -S . -B build

這時候被設定的值會被保存在build資料夾裡面的CMakeCache.txt。你可以打開這份文件並且找到這個選項被設定的值。你可以看到CLI11_INSTALL:BOOL=ON

1
2
3
4
5
6
7
8
9
10
11
...以上省略
//Build the tests with NVCC to check for warnings there - requires
// CMake 3.9+
CLI11_CUDA_TESTS:BOOL=OFF

//Install the CLI11 folder to include during install process
CLI11_INSTALL:BOOL=ON

//Value Computed by CMake
CLI11_IS_TOP_LEVEL:STATIC=ON
...以下省略

{: file=’CMakeCache.txt’}

如果在設定一次就可以發現他的值被改成OFF

1
cmake -DCLI11_INSTALL=OFF -S . -B build
1
2
3
4
5
6
7
8
9
10
11
...以上省略
//Build the tests with NVCC to check for warnings there - requires
// CMake 3.9+
CLI11_CUDA_TESTS:BOOL=OFF

//Install the CLI11 folder to include during install process
CLI11_INSTALL:BOOL=OFF

//Value Computed by CMake
CLI11_IS_TOP_LEVEL:STATIC=ON
...以下省略

{: file=’CMakeCache.txt’}
另外還有一些常見的CMake標準選項你可以設定

CMake除錯技巧

這節特別重要,如果要自己撰寫CMakeLists.txt話十分有用。--trace-source選項讓你指定你有興趣的檔案,並且依照他執行的順序依序印出他所執行的行數

1
cmake build --trace-source="CMakeLists.txt"

動手寫第一個CMakeLists.txt

我們將製作一個簡單的C語言程式,並且寫一個CMakeLists.txt

1
2
3
mkdir cmakeQuickStart
cd cmakeQuickStart
code .

cmakeQuickStart資料夾內建立一個CMakeLists.txt和一個simple.cpp

  1. cmake_minimum_required指定使用這份CMakeLists.txt最小所需的CMake版本。
  2. project指定專案名稱,而專案使用的語言預設為C++和C。如果要指定專案語言可以輸入LANGUAGES參數。
  3. 最後你要輸出執行檔或是library。add_executable指令輸出執行檔,add_library指令輸出library,輸出的執行檔或是library檔名在跟第一個參數一樣。在這裡特別注意,add_executable``add_library第一個參數為兩個東西命名,首先他命名了輸出檔案的檔案名稱,其次是他命名了一個CMake的targettarget在後面會很常用到。
1
2
3
4
5
6
7
/* simple.c or simple.cpp */
#include <stdio.h>

int main() {
printf("Hello, World!\n");
return 0;
}

{: file=’simple.cpp’}

1
2
3
4
5
cmake_minimum_required(VERSION 3.15)

project(MyProject)

add_executable(myexample simple.cpp)

{: file=’CMakeLists.txt’}

你也可以把CMakeLists.txt改成下面這樣,他指定了CMake的版本範圍,並且為專案增加說明和版本號

1
2
3
4
5
6
7
8
9
10
11
12
cmake_minimum_required(VERSION 3.15...3.21)

project(MyProject
VERSION
1.0
DESCRIPTION
"Very nice project"
LANGUAGES
CXX
)

add_executable(myexample simple.cpp)

{: file=’CMakeLists.txt’}

接下來你就可以編譯你的程式了,編譯後你會看到build資料夾出現一個myexample檔,跟你在add_executable指定的名稱一樣

1
2
cmake -S . -B build
cmake --build build

More Modern CMake
https://hsf-training.github.io/hsf-training-cmake-webpage/

An Introduction to Modern CMake
https://cliutils.gitlab.io/modern-cmake/

Windows下讓cmake找到OpenCV和Eigen

OpenCV

從(cmake 3.12)[https://cmake.org/cmake/help/v3.12/policy/CMP0074.html]之後,可以利用環境變數來告訴cmake套件的位置,在Windows下很方便,因為windows不像linux會把函式庫集中放在一起。設定方法就是利用設定環境變數

1
<PackageName>_ROOT

其中<PackageName>就是你的套件名稱,例如在這裡我們要設的環境變數就是OpenCV_ROOT,注意<PackageName>必須要和你寫在CMakeLists.txt裡面find_package(<PackageName>)大小寫都要一致

設定完後會看到cmake輸出找到的路徑

1
2
3
Environment variable OpenCV_ROOT is set to:

D:\lib\build_opencv

另外由於相容性的關係,cmake預設不會使用環境變數的OpenCV_ROOT,我們必須在CMakeLists.txt中設定打開這個功能

1
cmake_policy(SET CMP0074 NEW)

成功設定後可以看到cmake會有以下輸出

1
2
3
-- Found OpenCV: D:/lib/build_opencv (found version "4.6.0")
-- OpenCV library status:
-- version: 4.6.0

詳細寫法可以參考這個範例
https://gist.github.com/jenhaoyang/924698b31f7e3baede14286c67d6059a

Eigen3.4.0

使用find_package(Eigen3 REQUIRED)後需要get_target_property(EIGEN3_INCLUDE_DIR Eigen3::Eigen INTERFACE_INCLUDE_DIRECTORIES)
,根據這個issue的寫法https://gitlab.com/libeigen/eigen/-/issues/2486


參考:
https://seanzhengw.github.io/blog/cmake/2018/04/23/cmake-find-package.html
https://cmake.org/cmake/help/v3.12/policy/CMP0074.html
https://stackoverflow.com/questions/21314893/what-is-the-default-search-path-for-find-package-in-windows-using-cmake

Ubuntu更新cmake

前一陣子在windows上編譯Nvidia triton-inference-server發現他的編譯腳本有很多方便的的操作方法,升級cmake是其中之一,注意指令中有指定ubuntu版本
cmake官方有關於apt下載的說明

1
2
3
4
5
6
7
8
9
ENV DEBIAN_FRONTEND=noninteractive
RUN apt install software-properties-common -y
RUN wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc 2>/dev/null | \
gpg --dearmor - | \
tee /etc/apt/trusted.gpg.d/kitware.gpg >/dev/null && \
apt-add-repository 'deb https://apt.kitware.com/ubuntu/ focal main' && \
apt-get update && \
apt-get install -y --no-install-recommends \
cmake-data=3.21.1-0kitware1ubuntu20.04.1 cmake=3.21.1-0kitware1ubuntu20.04.1

參考:
https://github.com/triton-inference-server/server/blob/main/Dockerfile.QA#L65