前言
我们通常希望 工程 + CMakeLists.txt文件生成可执行文件。在Windows下使用通过如下命令行不打开IDE直接生成可执行文件(MSVC 2015)
cmake .. -G "Visual Studio 14 2015 Win64" //指定编译器msvc2015 64位
cmake --build . --config release //指定生成release版本的可执行程序
注意: 不要随意修改参数的位置
参考文章 [cmake] [visual stuido] 编译64位和32位指令
CMake编译Win32(MSVC)程序Release版本
常用的CMake命令
cmake_minimum_required(VERSION 3.18)
这个是必须的版本要求,因为CMake一直在发展中,当CMake遇到不认识的特性时,将直接导致CMake构建失败
project(MyProject)
配置工程的名称,此时可以使用 ${PROJECT_NAME}
值为 MyProject
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
指明要使用C++的标准,还是挺重要的。但是现在都2023年了 visual studio 2015都是默认使用C++11标准
add_compile_definitions(USE_LICENSE)
add_compile_definitions(LICENSE_NUM=10)
add_compile_definitions(LICENSE_INFO="fake license info")
添加宏定义,以及添加有值的宏定义。CMake官方推荐使用,还有个不推荐的就是add_definitions
。它有一个显著特点就是 add_definitions(-DFOO)
此时宏定义是FOO
,也就是说它要加一个-D
。需要了解因为肯定有很多开源的三方库还是用的这个
add_executable(${PROJECT_NAME}
${CMAKE_CURRENT_SOURCE_DIR}/src/main.cpp
)
这个更是重量级了,生成可执行文件,以及生成它所依赖的头文件。${PROJECT_NAME}
一般来说生成可执行文件与工程名称保持一致。${CMAKE_CURRENT_SOURCE_DIR}
也是重量级代表当前所在CMakeLists.txt
所在的目录
target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)
设置目标的头文件包含目录
message("Name : " ${PROJECT_NAME})
输出信息,通常用于CMake调试。建议如上写法,这样方便智能提示
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
注意这样的写法,在 win + mvsc下会自动扩展一层目录。也就是说如果是Debug模式,此时可执行文件是放在 ${PROJECT_SOURCE_DIR}/bin/Debug
add_library(${PROJECT_NAME} SHARED
${CMAKE_CURRENT_SOURCE_DIR}/MyMath.cpp
${CMAKE_CURRENT_SOURCE_DIR}/MyMath.h
)
生成库文件,${PROJECT_NAME}
代表名称。SHARED
代表是动态链接库 STATIC
代表是静态链接库
target_link_directories(${PROJECT_NAME}
PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/bin
)
设置target的链接库文件包含目录
target_link_libraries(${PROJECT_NAME} MyMath)
设置target链接的库文件名称
add_custom_target(COPY_TASK ALL
${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/MyMath.h ${CMAKE_CURRENT_SOURCE_DIR}/../include
COMMENT "copy begin"
)
add_custom_target
的用处: 增加一个没有输出的目标,使得它总是被构建。 COPY_TASK
就是目标名称。 ALL
代表总是被构建否则你需要如 cmake --build . --target COPY_TASK
来显试的去构建这个目标。注意: 这个是在编译前进行的操作。${CMAKE_COMMAND}
代表着 cmake.ext 的目录。-E
代表是运行命令而不是构建 copy
是 cmake 的 command_line。后面则是 command_line 的参数。上述命令在 cmake --build .
将进行文件拷贝。
真实情况模拟
- MyProject是一个主程序,而MyTools是一个小工具。我希望在编译MyProject是顺便就能将MyTools编译出来。同时MyTools完全对MyProject没有任何依赖
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/Tools)
此时就会编译 Tools目录 下的CMakeLists.txt