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)