編寫自己的 cmake module模塊 通過find_package指定編譯自己安裝的包如opencv cuda

cmake 主要命令解釋

FIND_PATH(VAR file path1 path2)將file文件路徑賦值給變量

FIND_LIBRARY(VAR lib path)將lib文件路徑賦值被變量

install(FILES flie DESTINATION dir_path) #執行make install時,把file拷貝到dir_path

install(PROGRAMS file DESTINATION dir_path) #執行make install時,把file拷貝到dir_path,並給予file可執行權限

install(TARGETS file DESTINATION dir_path) 執行make install時,把file拷貝到dir_path,並給予file可執行權限

find_package(XXX)尋找庫xxx,首先從自己工程建立的cmake目錄尋找;找不到再從系統cmake目錄如/usr/share/cmake/Modules/XXX.cmake

CMAKE_MODULE_PATH :自己工程定義的cmake目錄,裏面包含一些自己定義的庫的cmake文件如FINDCUDA.cmake

CMAKE_BINARY_DIR類似PROJECT_BINARY_DIR<projectname>_BINARY_DIR。這三個變量指代的內容是一致的,如果是 in source 編譯,指的就是工程頂層目錄,如果是 out-of-source (build目錄)編譯,指的是工程編譯發生的目錄。

demo工程結構

├── cmake
│   └── FindDEMO9LIB.cmake
├── CMakeLists.txt
├── demo9.cpp
├── demo9.h
└── maindemo9.cpp

demo9.h demo9.cpp maindemo9.cpp

//=========================demo9.h===================
#ifndef PROJECT_DEMO9_H
#define PROJECT_DEMO9_H

namespace demo9{
    void print_demo9();
}

#endif //PROJECT_DEMO3_H_H


//======================demo9.cpp==================
#include "demo9.h"
#include <iostream>

namespace demo9{
    void print_demo9(){
        std::cout<<"this is demo9"<<std::endl;
    }
}

//======================maindemo9.cpp==================

#include "demo9.h"

int main(){
    demo9::print_demo9();
    return 0;
}

FindDEMO9LIB.cmake的內容如下

# 輔助輸出信息
message("now using FindDEMO9LIB.cmake find demo9 lib")

# 將demo9.h文件路徑賦值給DEMO9LIB_INCLUDE_DIR
FIND_PATH(DEMO9LIB_INCLUDE_DIR demo9.h /usr/include/demo9/
        /usr/local/demo9/include/)
message("./h dir ${DEMO9LIB_INCLUDE_DIR}")

# 將libdemo9_lib.a文件路徑賦值給DEMO9LIB_LIBRARY
FIND_LIBRARY(DEMO9LIB_LIBRARY libdemo9_lib.a /usr/local/demo9/lib/)
message("lib dir: ${DEMO9LIB_LIBRARY}")

if(DEMO9LIB_INCLUDE_DIR AND DEMO9LIB_LIBRARY)
    # 設置變量結果
    set(DEMO9LIB_FOUND TRUE)
endif(DEMO9LIB_INCLUDE_DIR AND DEMO9LIB_LIBRARY)

主CMakeLists.txt內容如下

cmake_minimum_required(VERSION 3.5)

project(demo9)

# create libdemo9_lib.a
set(SRC_LIB demo9.cpp)
add_library(demo9_lib STATIC ${SRC_LIB})

# install it
install(TARGETS demo9_lib DESTINATION demo9/lib)
install(FILES demo9.h DESTINATION demo9/include)

# create demo9_main exectuable
set(SRC_EXE miandemo9.cpp)

# set demo9_lib cmake module path
set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
message("cmake_module_path: ${CMAKE_MODULE_PATH}")
find_package(DEMO9LIB)

if(DEMO9LIB_FOUND)
    add_executable(demo9_main ${SRC_EXE})
    message("found demo9 ${DEMO9LIB_INCLUDE_DIR} ${DEMO9LIB_LIBRARY}")
    include_directories(${DEMO9LIB_INCLUDE_DIR})
    target_link_libraries(demo9_main ${DEMO9LIB_LIBRARY})
else()
    message("not found DEMO9LIB_FOUND")
endif(DEMO9LIB_FOUND)
mkdir build
cd build
make install
#cpy lib to /usr/local/demo9/lib/libdemo9_lib.a and /usr/local/demo9/lib/libdemo9_lib.a

如果不想安裝在/usr目錄

那麼可以改寫

cmake文件

message("now using FindDEMO9LIB.cmake find demo9 lib")
message("CMAKE_CURRENT_SOURCE_DIR is ${CMAKE_CURRENT_SOURCE_DIR}")
message("CMAKE_BINARY_DIR is ${CMAKE_BINARY_DIR}")
#demo9.h文件路徑賦值
FIND_PATH(DEMO9LIB_INCLUDE_DIR demo9.h /usr/include/demo9/
        /data/learn/add1/)
message("./h dir ${DEMO9LIB_INCLUDE_DIR}")

#libdemoe9_lib.a文件路徑/usr/include/demo9/build賦值
FIND_LIBRARY(DEMO9LIB_LIBRARY libdemo9_lib.a ${CMAKE_BINARY_DIR})
message("./lib dir ${DEMO9LIB_LIBRARY}")

if(DEMO9LIB_INCLUDE_DIR AND DEMO9LIB_LIBRARY)
    SET(DEMO9LIB_FOUND TRUE)
endif(DEMO9LIB_INCLUDE_DIR AND DEMO9LIB_LIBRARY)

cmakelists.txt

cmake_minimum_required(VERSION 2.6)
project( demo9 )

#create libdemo9_lib.a
set(SRC_LIB demo9.cpp)
add_library(demo9_lib STATIC ${SRC_LIB})

#install it to /usr/local
#message("demo is ${demo9}")
#install(TARGETS demo9_lib DESTINATION demo9/lib)
#install(FILES demo9.h DESTINATION demo9/include)

#set demo9_lib cmake module_path
set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
message("CMAKE_MODULE_PATH is ${CMAKE_MODULE_PATH}")
find_package(DEMO9LIB)#from cmake dir

if(DEMO9LIB_FOUND)
    message("found demo9 ${DEMO9LIB_INCLUDE_DIR} ${DEMO9LIB_LIBRARY}")
    include_directories(${DEMO9LIB_INCLUDE_DIR})
    add_executable(demo9_main maindemo9.cpp)
    target_link_libraries(demo9_main ${DEMO9LIB_LIBRARY})
else()
    message("not found DEMO9LIB_FOUND")
endif(DEMO9LIB_FOUND)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章