下面是一个通用的CMake项目模板,适用于大多数C++项目,包含了可执行文件、库的创建、外部依赖的查找、安装规则及版本控制等功能:
# 指定CMake最低版本要求
cmake_minimum_required(VERSION 3.10 FATAL_ERROR)
# 设置项目名称和语言
project(MyGenericProject LANGUAGES CXX)
# 设置C++标准,这里假设使用C++17
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# 定义全局编译选项(可选)
option(BUILD_SHARED_LIBS "Build shared libraries" OFF)
# 配置源代码目录结构(可替换src和lib为实际目录)
add_subdirectory(src)
# 示例:添加一个库
# 在实际项目中替换"MyLibrary"和"src/library/*.cpp"
add_library(MyLibrary STATIC
src/library/file1.cpp
src/library/file2.cpp
)
# 库的公共头文件目录(便于使用者包含)
target_include_directories(MyLibrary
PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
# 若有安装后的头文件位置,加入INSTALL_INTERFACE部分
# INTERFACE
# $<INSTALL_INTERFACE:include/MyLibrary>
)
# 示例:添加一个可执行文件
# 替换"MyExecutable"和"src/executable/*.cpp"
add_executable(MyExecutable
src/executable/main.cpp
src/executable/other.cpp
)
# 链接库到可执行文件
target_link_libraries(MyExecutable PRIVATE MyLibrary)
# 查找外部依赖(例如Boost)
# find_package(Boost REQUIRED COMPONENTS system thread)
# 如果找到外部依赖,则链接它们
# if(Boost_FOUND)
# target_link_libraries(MyExecutable PRIVATE Boost::system Boost::thread)
# endif()
# 安装规则(库、可执行文件、头文件)
install(TARGETS MyLibrary MyExecutable
EXPORT MyGenericProjectConfig
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib
INCLUDES DESTINATION include
)
# 安装CMake配置文件
install(EXPORT MyGenericProjectConfig
FILE MyGenericProjectTargets.cmake
NAMESPACE MyGenericProject::
DESTINATION lib/cmake/MyGenericProject
)
# 包含CTest以支持单元测试(可选)
if(BUILD_TESTING)
enable_testing()
add_subdirectory(tests)
endif()
# 版本控制信息(Git为例,需确保项目在git仓库中)
include(GetGitRevisionDescription)
get_git_head_revision(GIT_REVISION_SHA1)
if(NOT GIT_REVISION_SHA1_ISdirty)
set(PROJECT_VERSION "${GIT_REVISION_SHA1}")
else()
set(PROJECT_VERSION "DIRTY-${GIT_REVISION_SHA1}")
endif()
message(STATUS "Building version ${PROJECT_VERSION}")
# 设置版本信息(可选择性地添加到生成的可执行文件或库中)
set_target_properties(MyExecutable PROPERTIES VERSION ${PROJECT_VERSION})
set_target_properties(MyLibrary PROPERTIES VERSION ${PROJECT_VERSION})
# (如果有额外的自定义步骤,比如生成文档、代码格式检查等,可以在此处添加)
请注意,你需要根据具体项目的需求修改上述模板中的项目名称、源文件路径、外部依赖查找、编译选项以及版本控制信息等内容。同时,对于实际的外部依赖查找,如Boost,在 find_package()
后面的部分应根据实际情况填写对应的组件和链接指令。对于版本控制,如果项目不是基于Git管理,或者不需要版本信息注入到目标属性中,那么这部分也可以删除或替换为适合项目本身的版本获取方式。