Cmake使用记录-基本使用

1.概述

Cmake作用编译工具,作用较大,主要记录以下几点:

  • 基础的使用功能,理解常见的变量及其对应的含义。
  • 扩展功能,编写自己的宏(条件)。
  • 实际环境中使用,如何生成makefile。 ## 2.基础功能使用 基础功能,主要是变量,基础的逻辑等等。 ### 2.1 相关变量 ```c ${CMAKE_CURRENT_SOURCE_DIR} #当前源码路径 set(CMAKE_C_STANDARD 99) #设置c语言标准 CMAKE_INSTALL_PREFIX #安装目录
### 2.2 逻辑控制
这类逻辑较简单:
```c
if(WIN32)
    message(STATUS, " THIS IS MESSAGE FROM WIN32")
else()
    message(STATUS, " THIS IS MESSAGE FROM OTHER")
endif()

2.3 自定义宏

自定义宏的好处就是,可以通过option选项,进行判断 自定一个宏 link_targets_conditionally

# 定义宏:条件链接目标---重新定义一个宏
# 参数1:CONDITION - 开关变量(ON/OFF)
# 参数2:MAIN_TARGET - 主目标(需要被链接的目标)
# 参数3及以后:LINK_TARGETS - 条件链接的目标列表(可变参数)
macro(link_targets_conditionally CONDITION MAIN_TARGET)
    # 检查主目标是否存在
    if(NOT TARGET ${MAIN_TARGET})
        message(FATAL_ERROR "主目标 ${MAIN_TARGET} 不存在!")
    endif()

    # 提取可变参数(条件链接的目标列表)
    set(LINK_TARGETS ${ARGN})

    # 检查开关状态,决定是否链接
    if(${CONDITION})
        message(STATUS " ${CONDITION} is ON, Will link the target: ${LINK_TARGETS}  to ${MAIN_TARGET}")
        target_link_libraries(${MAIN_TARGET} PRIVATE ${LINK_TARGETS})
    else()
        message(STATUS " ${CONDITION} is OFF, Will not link the target: ${LINK_TARGETS}")
    endif()
endmacro()

在cmake中进行宏调用

# 1. 定义开关变量(可通过 cmake -DENABLE_PROTOBUF_TEST=ON 外部控制)
option(ENABLE_PROTOBUF_TEST "CHECK PROTOBUF STATUS " ON)

if(ENABLE_PROTOBUF_TEST)
    #protobuf-c
    list(APPEND BUILD_SRC_FILE protobuf_demo/protobuf_c_student_demo.c)
    list(APPEND BUILD_SRC_FILE protobuf_demo/student.pb-c.c)

    list(APPEND BUILD_INC_FILE_DIR ./protobuf_demo)
endif()

# 链接库,---使用新定义的宏进行判断

link_targets_conditionally( ENABLE_PROTOBUF_TEST testc PRIVATE
        protobuf-c  # 链接 protobuf-c 库(libprotobuf-c.a
        protobuf    # 链接 Protobuf 库(libprotobuf.a
)

3.扩展功能

记录一些,在实际使用过程中,如何进行生成makefile,然后执行make(windows下,可以使用mingw32)

3.1 mingw32环境

在mingw32环境下,可以使用cmake生成mingw32下的makefile (默认是unix 下的makefile)

echo ===============================================
echo [First] Building exe
echo ===============================================
rem 获取当前脚本所在路径(包含末尾反斜杠)使用 set "变量=值" 的语法可以避免路径中包含空格时出现解析错误。
set "PRO_PATH=%~dp0"
echo build dir path:%PRO_PATH%

rem 拼接其他路径(注意使用反斜杠 \ ,批处理中推荐用反斜杠)
set "PRO_SOURCE=%PRO_PATH%"
set "PRO_BUILD=%PRO_PATH%build"
set "PRO_INSTALL=%PRO_PATH%install"

:: 清理旧构建
if exist "%PRO_BUILD%" rmdir /s /q "%PRO_BUILD%"
if exist "%PRO_INSTALL%" rmdir /s /q "%PRO_INSTALL%"

:: 创建目录
mkdir "%PRO_BUILD%"
mkdir "%PRO_INSTALL%"

cd /d "%PRO_BUILD%"


echo Configuring [mingw32]:{%PRO_SOURCE%} ...
cmake .. ^
    -G "MinGW Makefiles" ^
    -DCMAKE_INSTALL_PREFIX="%PRO_INSTALL%"

if errorlevel 1 (
    echo pro configuration failed!
    exit /b 1
)

echo Building exe ...
mingw32-make -j4

if errorlevel 1 (
    echo pro build failed!
    exit /b 1
)

echo Installing exe to...
mingw32-make install

4.总结

CMAKE上使用还有其他的功能,比如进行,cmake目标构建,cmake package构建,区别cmake目标 在本工程内都有效,需要导入其它路径的cmake目标需要注意,cmake package可以提供给其它工程使用。 另外cmake在cmake 目标方面也有一些暴露权限控制。