Cmake基础(3)

这篇文章也是一个无三方库的单项目
根据位数和模式分目录存放可执行文件,而且可执行的文件名中包含了位数、模式和编译器。

目录

  • 给出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*)。这个变量的值通常为 48,表示指针在系统中占用的字节数。在绝大多数情况下,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

你可能感兴趣的:(cmake,cmake)