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


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM