CMake--模組的使用和自定義模組
阿新 • • 發佈:2020-12-25
1.連結外部庫
如果程式中使用了外部庫,事先並不知道它的標頭檔案和連結庫的位置,就要給出標頭檔案和連結庫的查詢方法,並將他們連結到程式中。
FIND_PACKAGE(<name> [major.minor] [QUIET] [NO_MODULE]
[[REQUIRED|COMPONENTS] [componets...]])
1) find_package()的查詢路徑
find_package()命令首先會在模組路徑中尋找 一個事先編譯好的Find.cmake檔案,而且一般官方給出了很多,不需要自己編寫這是查詢庫的一個典型方式。
具體查詢路徑依次為CMake:
模組模式
- ${CMAKE_MODULE_PATH}中的所有目錄。
- 模組目錄 /share/cmake-x.y/Modules/ 這稱為。
配置模式
- ~/.cmake/packages/或/usr/local/share/中的各個包目錄中查詢,尋找<庫名字的大寫>Config.cmake 或者 <庫名字的小寫>-config.cmake (比如庫Opencv,它會查詢/usr/local/share/OpenCV中的OpenCVConfig.cmake或opencv-config.cmake)。
2) *.cmake檔案定義變數
不管使用哪一種模式,只要找到.cmake,.cmake裡面都會定義下面這些變數:
<NAME>_FOUND
<NAME>_INCLUDE_DIRS or <NAME>_INCLUDES
<NAME>_LIBRARIES or <NAME>_LIBRARIES or <NAME>_LIBS
<NAME>_DEFINITIONS
注意大部分包的這些變數中的包名是全大寫的,如 LIBFOO_FOUND ,有些包則使用包的實際大小寫,如 LibFoo_FOUND
3)新增標頭檔案與連結庫檔案
如果找到這個包,則可以通過在工程的頂層目錄中的CMakeLists.txt 檔案新增 include_directories(_INCLUDE_DIRS) 來包含庫的標頭檔案,新增target_link_libraries(原始檔_LIBRARIES)命令將原始檔與庫檔案連結起來。
4) 連結OpenCV的例子
建立t4目錄新增cmake目錄與main.cpp與CMakeList.txt檔案
建立cmake目錄新增FindOpenCV.cmake檔案。
CMakeList.txt
cmake_minimum_required(VERSION 2.8)
PROJECT (HELLO)
SET(SRC_LIST main.cpp)
INCLUDE_DIRECTORIES(cmake)
SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
#在${CMAKE_MODULE_PATH}中新增包含FindOpenCV.cmake目錄
FIND_PACKAGE(OpenCV)
#獲取OPENCV_FOUND OPENCV_INCLUDE_DIR OPENCV_LIBRARIES
INCLUDE_DIRECTORIES(${OPENCV_INCLUDE_DIR})
ADD_EXECUTABLE(hello ${SRC_LIST})
TARGET_LINK_LIBRARIES(hello ${OPENCV_LIBRARIES})
main.cpp
#include <iostream>
#include <opencv2/opencv.hpp>
int main()
{
cv::Mat image = cv::imread("../timg.jpeg");
if (!image.empty()) {
cv::imshow("image", image);
cv::waitKey(-1);
} else {
std::cout << "Can not get image." << std::endl;
}
return 0;
}
2.自定義模組(作業)
編寫FindHello.cmake與CMakeList.txt檔案,將CMAKE工程小結所安裝的hello連結至主函式,呼叫HelloFunc()函式輸出相應內容:
給出main.c 檔案:
#include <hello/hello.h>
int main()
{
HelloFunc();
return 0;
}