一个CMakeLists.txt例子
所在目录结构如下:
wfq@wfq:~/MyProjects/cmaketest$ tree .
.
├── CMakeLists.txt
├── cmake_module
│ └── FindHELLO.cmake
├── include
│ └── head.h
├── main.cpp
├── src
│ └── head.cpp
└── SubFolder
└── CMakeLists.txt
CMakeLists.txt
文件
cmake_minimum_required(VERSION 3.0)
project(ProjectName)
set(CMAKE_BUILD_TYPE "Release") //或"Debug"
set(CMAKE_CXX_FLAGS "-std=c++11(14)")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2 -g -Wall")
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin) #内置的可执行文件存放目录
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib) #内置的中间库文件存放目录
//#定义一个存放.cmake文件的目录,CMAKE_MODULE_PATH查找优先级最高
set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake_module) #写个FindNAME.cmake文件自定义查找库
//#或添加.cmake文件目录
list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake_module)
find_package(HELLO REQUIRED) //#根据cmake_module里的FindHELLO.cmake(示例见下面内容)查找的
message("hello.h is here:: ${HELLO_INCLUDE_DIRS}") //#这个是目录,头文件所在目录
message("libhello.a(.so) is:: ${HELLO_LIBRARIES}") //#这个是文件,库文件
AUX_SOURCE_DIRECTORY(dir VAR) //#把dir中的源文件全部赋给变量VAR
//#例如 AUX_SOURCE_DIRECTORY(${PROJECT_SOURCE_DIR}/src SRC_DIR)
add_library(<libname> SRC_DIR)
//#生成链接库文件
add_library(<library_name> [SHARED|STATIC] src/head.cpp ...) //#默认存放在当前地址,如build里
include_directories(${PROJECT_SOURCE_PATH}/include) //#头文件目录
link_directories() //#链接库文件目录 取而代之的是find_package()里的find_library()
add_subdirectory(SubFolder) //#添加子目录,里面必须有CMakeLists.txt文件
//#main.cpp是主程序,主程序才能生成可执行文件,而一般的源文件只能add_library()成库文件
add_executable(${PROJECT_NAME} main.cpp)
add_executable(${PROJECT_NAME} main.cpp src/head.cpp)//# 这样就不用链接了
//#为可执行文件或库文件链接库A B C(不带lib和后缀.a,.so的链接库文件)
target_link_libraries(<可执行文件或库文件> A B C)
//#如
target_link_libraries(${PROJECT_NAME} head ${OpenCV_LIBS})
********************************************************************************
//##使用eigen3,Pangolin,Sophus,OpenCV,Ceres,g2o
//# eigen3,只有头文件,只需要include_directories()头文件,没有target_link_libraries()库文件
include_directories("/usr/include/eigen3")
//# Pangolin
find_package(Pangolin REQUIRED)
include_directories(${Pangolin_INCLUDE_DIRS})
target_link_libraries(${PROJECT_NEME} ${Pangolin_LIBRARIES})
//有时候Pangolin需要fmt依赖
target_link_libraries(${PROJECT_NAME} ${Pangolin_LIBRARIES} fmt)
//#Sophus 和eigen一样只有头文件
//!!!!!必须依赖eigen3.3以上版本
find_package(Sophus REQUIRED)
include_directories(${Sophus_INCLUDE_DIRS} “/usr/include/eigen3")
//Sophus有时候需要fmt依赖
target_link_libraries(${PROJECT_NAME} fmt)
//很奇怪我的find_package(Sophus REQUIRED)之后,头文件和库文件变量啥也没有,因为直接装在/usr/local里了,所以我可以直接用Sophus,加一个target_link_libraries(${PROJECT_NAME} fmt)就可以了
//#OpenCV
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS})
//#Ceres
find_package(Ceres REQUIRED)
include_directories(${CERES_INCLUDED_DIRS})
target_link_libraries(${PROJECT_NAME} ${CERES_LIBRARIES})
//#g2o 得自己写个FindG2O.cmake文件,才能像下面一样写
find_package(G2O REQUIRED)
include_directories($G2O_INCLUDE_DIRS})
target_link_libraries(${PROJECT_NAME} ${G2O_CORE_LIBRARY} ${G2O_STUFF_LIBRARY})
//#g20 直接法
include_directories("/usr/local/include/g2o")
target_link_libraries("usr/local/lib/<lib_name>")
//#如
target_link_libraries("/usr/local/lib/g2o_core")
FindHELLO.cmake
文件
//#最小的可以实现查找头文件和库文件的.cmake文件
find_path(HELLO_INCLUDE_DIRS hello.h /usr/local/include
/usr/include
~/MyProjects/HelloTest/include) //#已知在这里
find_library(HELLO_LIBRARIES hello ~/MyProjects/HelloTest/build) //#已知链接库文件libhello.a或.so在这里
if(HELLO_INCLUDE_DIR AND HELLO_LIBRARIES)
set(HELLO_FOUND TRUE)
else()
set(HELLO_FOUND FALSE)
endif()