这篇文章也是一个无三方库的单项目
根据位数和模式分目录存放可执行文件,而且可执行的文件名中包含了位数、模式和编译器。
目录
- 给出cmake文件
- 使用mingw的结果
- cmake中的一些知识点
- 变量设置与访问
- cmake中的函数
- cmake的预定义
本文有以下几个要点
- cmake中常用路径的宏定义
- 设置输出路径
- 根据relsea和平台来确定可执行文件名称
cpp文件还是上一篇文章中的,是一个简单的cout。
给出cmake文件
cmake_minimum_required(VERSION 3.12)
project(MyProject)# 设置可执行文件名
set(EXECUTABLE_NAME "MyExecutable")
# 添加可执行文件
add_executable(${EXECUTABLE_NAME} main.cpp)message(STATUS "^^^^^^Compiler: ${CMAKE_CXX_COMPILER_ID}")# 获取编译器标识符
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")set(COMPILER_NAME "gcc")
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")set(COMPILER_NAME "msvc")
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")set(COMPILER_NAME "clang")
else()message(FATAL_ERROR "Unsupported compiler")
endif()#获取系统位数
if(${COMPILER_NAME} STREQUAL "msvc" )if(CMAKE_CL_64)set(platform "x64")else(CMAKE_CL_64)set(platform "x64")endif(CMAKE_CL_64)
else()# sizeof(void*)。这个变量的值通常为 4 或 8,表示指针在系统中占用的字节数。在绝大多数情况下,32 位系统中指针大小为 4 字节,64 位系统中指针大小为 8 字节if( CMAKE_SIZEOF_VOID_P EQUAL 8 )set(platform "x64")else()set(platform "x86")endif()
endif()# 设置输出路径 debug和release 分开存放
# lib目录
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${CMAKE_SOURCE_DIR}/Lib/${platform}/Debug)
# dll目录
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG ${CMAKE_SOURCE_DIR}/Lib/${platform}/Debug)
# exe目录
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_SOURCE_DIR}/Bin/${platform}/Debug)
# PDB目录
set(CMAKE_PDB_OUTPUT_DIRECTORY_DEBUG ${CMAKE_SOURCE_DIR}/PDB/${platform}/Debug)set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${CMAKE_SOURCE_DIR}/Lib/${platform}/Release)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE ${CMAKE_SOURCE_DIR}/Lib/${platform}/Release)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_SOURCE_DIR}/Bin/${platform}/Release)
set(CMAKE_PDB_OUTPUT_DIRECTORY_RELEASE ${CMAKE_SOURCE_DIR}/PDB/${platform}/Release)# 设置后缀变量
set(CMAKE_DEBUG_POSTFIX _${platform}d_${COMPILER_NAME})
set(CMAKE_RELEASE_POSTFIX _${platform}_${COMPILER_NAME})# 给可执行文件设置后缀名
set_target_properties(${EXECUTABLE_NAME} PROPERTIES DEBUG_POSTFIX ${CMAKE_DEBUG_POSTFIX}RELEASE_POSTFIX ${CMAKE_RELEASE_POSTFIX})# debug模式下保存调试信息
if(${COMPILER_NAME} STREQUAL "msvc" )set_target_properties(${EXECUTABLE_NAME} PROPERTIES LINK_FLAGS /DEBUG )
endif()
使用mingw的结果
E:\workspace\cmake_demo\simple_demo\bin\x64\Release\MyExecutable_x64_gcc.exe
从结果出看出根据位数和模式分开存放可执行文件,而且可执行的文件名中包含了位数、模式和编译器。
cmake -G “MinGW Makefiles” -DCMAKE_C_FLAGS=-m64 -DCMAKE_BUILD_TYPE=Release …
上篇文章提到了-D还记得吗?-D是设置变量,CMAKE_C_FLAGS和CMAKE_BUILD_TYPE是cmake预定义的,分别表示位数和模式。mingw32-make按照cmake中的来编译,无需额外设置参数。
PS E:\workspace\cmake_demo\simple_demo\build_mingw> cmake -G "MinGW Makefiles" -DCMAKE_C_FLAGS=-m64 -DCMAKE_BUILD_TYPE=Release ..
-- The C compiler identification is GNU 8.1.0
-- The CXX compiler identification is GNU 8.1.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: E:/MinGW/mingw64/bin/gcc.exe - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: E:/MinGW/mingw64/bin/c++.exe - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- ^^^^^^Compiler: GNU
-- Configuring done (1.0s)
-- Generating done (0.0s)
-- Build files have been written to: E:/workspace/cmake_demo/simple_demo/build_mingw
PS E:\workspace\cmake_demo\simple_demo\build_mingw> mingw32-make
[ 50%] Building CXX object CMakeFiles/MyExecutable.dir/main.cpp.obj
[100%] Linking CXX executable E:\workspace\cmake_demo\simple_demo\bin\x64\Release\MyExecutable_x64_gcc.exe
[100%] Built target MyExecutable
PS E:\workspace\cmake_demo\simple_demo\build_mingw>
MSVC就不演示了
cmake中的一些知识点
变量设置与访问
使用set 设置变量,使用${} 访问变量
cmake中的函数
add_executable 和set_target_properties 都是cmake的函数,函数名不分大小写。也可以自定义函数,后面的文章会提及。
cmake的预定义
这是cmake预先定义的宏,不分大小写。
CMAKE_SOURCE_DIR
:CMakeLists.txt所在的源代码根目录。
CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG
:Debug构建时库文件输出目录。
CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG
:Debug构建时动态库文件输出目录。
CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG
:Debug构建时可执行文件输出目录。
CMAKE_PDB_OUTPUT_DIRECTORY_DEBUG
:Debug构建时PDB文件输出目录。
CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE
:Release构建时库文件输出目录。
CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE
:Release构建时动态库文件输出目录。
CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE
:Release构建时可执行文件输出目录。
CMAKE_PDB_OUTPUT_DIRECTORY_RELEASE
:Release构建时PDB文件输出目录。
CMAKE_SIZEOF_VOID_P
:指针大小,通常为4或8字节,表示系统是32位还是64位。
CMAKE_CXX_COMPILER_ID
:表示C++编译器的标识符,可能的值为 “GNU”、“MSVC”、“Clang” 等。
CMAKE_BUILD_TYPE
:用于设置构建类型,例如 “Debug” 或 “Release”。
CMAKE_CL_64
:这个变量在MSVC编译器中用于判断是否为64位系统。
CMAKE_DEBUG_POSTFIX
:用于指定Debug构建的输出文件名后缀。
CMAKE_RELEASE_POSTFIX
:用于指定Release构建的输出文件名后缀
推荐链接
https://cmake.org/cmake/help/latest/#
https://cmake.org/cmake/help/latest/guide/tutorial/index.html