CMake使用教程
cmake学习github
1 常用命令
CMAKE_PREFIX_PATH |
find_package的搜索目录 |
EXECUTABLE_OUTPUT_PATH |
exe的输出目录 |
LIBRARY_OUTPUT_PATH |
lib,dll的输出目录 |
include_directories |
对应vs中的附加包含目录 |
link_directories |
对应vs中的附加库目录 |
link_libraries |
对应vs中的附加依赖项,它一定得在add_executable或add_library之前 |
add_executable |
生成exe程序 |
add_library |
生成lib或dll库 |
find_package |
如果第三次库提供了xxxx.cmake,配置CMAKE_PREFIX_PATH可找到include,lib等 |
target_link_libraries |
它一定得在add_executable或add_library之后 |
add_subdirectory(xxx) |
Xxx目录下必须存在一个CMakeLists.txt |
2 宏
1. 分组自动按照目录添加筛选器和查找当前目录下的指定文件
#定义分组宏 MACRO(source_group_by_dir src_files) SET(cur_dir ${CMAKE_CURRENT_SOURCE_DIR}) FOREACH(group_files ${${src_files}}) STRING(REGEX REPLACE ${cur_dir}/\(.*\) \\1 sgbd_fpath ${group_files}) STRING(REGEX REPLACE "\(.*\)/.*" \\1 sgbd_group_name ${sgbd_fpath}) STRING(COMPARE EQUAL ${sgbd_fpath} ${sgbd_group_name} sgbd_nogroup) STRING(REPLACE "/" "\\" sgbd_group_name ${sgbd_group_name}) IF(sgbd_nogroup) SOURCE_GROUP("" FILES ${group_files}) ELSE() INCLUDE_DIRECTORIES(${sgbd_group_name}) SOURCE_GROUP(${sgbd_group_name} FILES ${group_files}) ENDIF(sgbd_nogroup) ENDFOREACH(group_files) ENDMACRO(source_group_by_dir) # 将下列扩展名的文件添加到项目中 macro(find_cur_all_files CUR_DIR) file(GLOB_RECURSE ${CUR_DIR} "*.h" "*.cpp" "*.hpp" "*.ipp" "*.cc" "*.ui" "*.qrc" "*.md") endmacro(find_cur_all_files)
3 示例
最顶层CMakeLists.txt
cmake_minimum_required(VERSION 3.5) project(learncmake LANGUAGES CXX) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_PREFIX_PATH "D:\\qt\\5.14.2\\5.14.2\\msvc2017") set(CMAKE_AUTOUIC ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) #定义exe, lib, dll的安装目录 set(INSTALL_BIN_PATH ${CMAKE_CURRENT_SOURCE_DIR}/bin) #设置兼容xp #set(CMAKE_GENERATOR_TOOLSET "v140_xp" CACHE STRING "Platform Toolset" FORCE) set(CMAKE_DEBUG_POSTFIX "d") #子项目 add_subdirectory(main) add_subdirectory(widget)
//==========================================================
main目录下的CMakeLists.txt
include(../module.cmake) find_cur_all_files(CUR_DIRS) source_group_by_dir(CUR_DIRS) set(EXECUTABLE_OUTPUT_PATH ${INSTALL_BIN_PATH}) add_executable(helloworld ${CUR_DIRS}) find_package(Qt5 COMPONENTS core gui widgets REQUIRED ) target_link_libraries(helloworld PRIVATE Qt5::Core Qt5::Gui Qt5::Widgets )
//=======================================================
Widget目录下CMakeLists.txt
# 动态库 include(../module.cmake) include_directories(.) find_cur_all_files(CUR_DIRS) source_group_by_dir(CUR_DIRS) set(EXECUTABLE_OUTPUT_PATH ${INSTALL_BIN_PATH}) add_executable(widget WIN32 ${CUR_DIRS}) find_package(Qt5 COMPONENTS core gui widgets REQUIRED ) target_link_libraries(widget PRIVATE Qt5::Core Qt5::Gui Qt5::Widgets )