1.鏈接外部庫
如果程序中使用了外部庫,事先並不知道它的頭文件和鏈接庫的位置,就要給出頭文件和鏈接庫的查找方法,並將他們鏈接到程序中。
FIND_PACKAGE(<name> [major.minor] [QUIET] [NO_MODULE]
[[REQUIRED|COMPONENTS] [componets...]])
1) find_package(
)的查找路徑
find_package(
具體查找路徑依次為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(
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;
}
