帮你快速构建自己的cmake工程
本文旨在用较短的篇幅介绍一个cmake构建C++工程结构,并提供一个工程实例,方便大家参考。如果您时间充裕或想系统学习cmake,请参考本文最后的下载链接。
cmake的用途定义等不在此讨论,下面以目录为索引进行讲解。
一、工程目录结构介绍
FastCmakeDemo:工程根目录
MathFunctionLib:数学工具库(代码)
src:工程主体代码
bin:可执行程序生成目录
build:camke生成中间产物路径
doc:项目文档安装路径
hello:src子目录,用于表示复杂工程目录
installDir:工程安装路径
二、FastCmakeDemo 下配置
FastCmakeDemo作为根目录主要负责对工程进行全局配置,功能点有:
1. 定义工程名称
PROJECT (FastCmakeDemo)
2. 配置编译参数
设置工程编译类型:
SET(CMAKE_BUILD_TYPE "Debug")
设置工程编译参数:
SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g2 -ggdb")
SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")
3.向源码中传入cmake配置置
#此部分演示通过cmake向CXX工程传递参数
# 我们应该使用我们自己的数学函数吗?
option (USE_MYMATH "Use tutorial provided math implementation" ON)
# 版本号
set (Tutorial_VERSION_MAJOR 1)
set (Tutorial_VERSION_MINOR 0)
configure_file (
#cmake配置
"${PROJECT_SOURCE_DIR}/TutorialConfig.h.in"
#转换成头文件给cxx工程
"${PROJECT_SOURCE_DIR}/src/TutorialConfig.h"
)
TutorialConfig.h.in:
// 与工程相关的配置的选项与设置;
#define Tutorial_VERSION_MAJOR @[email protected]
#define Tutorial_VERSION_MINOR @[email protected]
#define USE_MYMATH @[email protected]
4. 配置安装信息
#配置install相关
IF(CMAKE_BUILD_TYPE)
set(CMAKE_INSTALL_PREFIX "${PROJECT_SOURCE_DIR}/installDir/Debug/usr")
ELSE()
set(CMAKE_INSTALL_PREFIX "${PROJECT_SOURCE_DIR}/installDir/Release/usr")
ENDIF()
INSTALL(FILES COPYRIGHT README DESTINATION share/doc/cmake/)
INSTALL(PROGRAMS runhello.sh DESTINATION bin)
INSTALL(DIRECTORY doc/ DESTINATION share/doc/cmake/)
5. 引入下一层目录
ADD_SUBDIRECTORY(MathFunctionLib)
#添加工程目录,包含main.cxx的放在最后面,src为源码路径,bin为生成路径
ADD_SUBDIRECTORY(src bin)
三、MathFunctionLib下配置
本级目录主要演示功能为生成链接库,目录结构见下图:
功能点有:
1. 添加源文件
添加链接库功能实现源码。
aux_source_directory(. DIR_LIB_SRCS)
ADD_LIBRARY(math_shared SHARED ${DIR_LIB_SRCS})
ADD_LIBRARY(math_static STATIC ${DIR_LIB_SRCS})
2. 设置库生成路径
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
3. 设置库导出名称
SET_TARGET_PROPERTIES(math_shared PROPERTIES OUTPUT_NAME "math")
SET_TARGET_PROPERTIES(math_static PROPERTIES OUTPUT_NAME "math")
4. 设置动态库版本号
SET_TARGET_PROPERTIES(math_shared PROPERTIES VERSION 1.2 SOVERSION 1)
5. 配置生成路径
set(CMAKE_INSTALL_PREFIX lib)
INSTALL(TARGETS math_static math_static LIBRARY DESTINATION lib ARCHIVE DESTINATION lib)
INSTALL(FILES mysqrt.h DESTINATION include/MathFunctionLib)
四. src下的配置
本级目录主要演示功能源码顶层目录(main.cxx所在路径)配置,目录结构见下图:
功能点有:
1.添加源文件
AUX_SOURCE_DIRECTORY(. SRC_LIST)
2.配置所需头文件路径
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/MathFunctionLib)
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_LIST_DIR}/hello)
3. 配置所需库
#库目录,需要放在ADD_EXECUTABLE方法之前
LINK_DIRECTORIES(${PROJECT_BINARY_DIR}/lib)
#math即上一节中提到的库,hello(也是库)下一节介绍。
TARGET_LINK_LIBRARIES(a hello math)
4. 配置生成目标
a即为工程最后生成的可执行文件
ADD_EXECUTABLE(a ${SRC_LIST})
5. 引入下一层目录
ADD_SUBDIRECTORY(${CMAKE_CURRENT_LIST_DIR}/hello)
6. 引入依赖
下一节介绍。
ADD_DEPENDENCIES(a hello_static)
7. 配置生成路径
INSTALL(TARGETS a RUNTIME DESTINATION bin)
五、hello下的配置
Hello为src的子目录,main.cxx通过引入静态链接库的方式连接子目录中相关功能的实现。所以需要四中6的配置。这样才会编译hello目录下的代码。目录结构见下图。
配置类似三只需生成静态库即可。
六、编译安装工程
七、参考
1. Cmake practice,一步步构建一个功能复杂的cmake工程,博主主要参考的教程。
2. CGold Documentation,对cmake各种功能特性有较详细的介绍。