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)