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 目标方面也有一些暴露权限控制。
您还没有登录,请您登录后发表评论。