编写自己的 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)

 

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