1. 程式人生 > 其它 >CMake--模組的使用和自定義模組

CMake--模組的使用和自定義模組

技術標籤:cmakecmake

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;
}