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 
)

0

Publication author

offline 2年

lengyuewuxin

0
Comments: 0Publics: 25Registration: 15-07-2018
Authorization
*
*
Registration
*
*
*
Password generation