CMake基本使用

预定义变量的使用

测试目录如下:


image.png

可以看到只有两个源文件hello.c,test.c,cd到build目录执行cmake

cmake_minimum_required(VERSION 3.4.1)
project(hello)
message(STATUS "PROJECT_NAME:" ${PROJECT_NAME}) # project函数里面的值
message(STATUS "CMAKE_MAJOR_VERSION:" ${CMAKE_MAJOR_VERSION}) #cmake主版本号
message(STATUS "CMAKE_MINOR_VERSION:" ${CMAKE_MINOR_VERSION}) #cmake次版本号
message(STATUS "CMAKE_PATCH_VERSION:" ${CMAKE_PATCH_VERSION}) #cmake补丁版本号
message(STATUS "CMAKE_HOST_SYSTEM:" ${CMAKE_HOST_SYSTEM}) #系统
message(STATUS "CMAKE_HOST_SYSTEM_NAME:" ${CMAKE_HOST_SYSTEM_NAME}) #系统名称
message(STATUS "CMAKE_HOST_SYSTEM_VERSION:" ${CMAKE_HOST_SYSTEM_VERSION}) #系统版本
message(STATUS "CMAKE_HOST_SYSTEM_PROCESSOR:" ${CMAKE_HOST_SYSTEM_PROCESSOR}) #处理器类型
message(STATUS "PROJECT_SOURCE_DIR:" ${PROJECT_SOURCE_DIR}) #cmake命令后紧跟的目录,一般是工程的根目录
message(STATUS "PROJECT_BINARY_DIR:" ${PROJECT_BINARY_DIR}) #cmake命令执行的目录
message(STATUS "hello_SOURCE_DIR:" ${hello_SOURCE_DIR}) #cmake命令后紧跟的目录,一般是工程的根目录
message(STATUS "hello_BINARY_DIR:" ${hello_BINARY_DIR}) #cmake命令执行的目录
message(STATUS "CMAKE_CURRENT_SOURCE_DIR:" ${CMAKE_CURRENT_SOURCE_DIR}) #当前处理的CMakeLists.txt 所在的路径
message(STATUS "CMAKE_CURRENT_LIST_FILE:" ${CMAKE_CURRENT_LIST_FILE}) #使用这个变量的CMakeLists.txt路径
message(STATUS "CMAKE_CURRENT_LIST_LINE:" ${CMAKE_CURRENT_LIST_LINE}) #当前变量在CMakeLists.txt文件中的行号
message(STATUS "UNIX:" ${UNIX})
message(STATUS "WIN32:" ${WIN32})
add_subdirectory(test)
include_directories(test) 
add_executable(main ${SRC_LIST})
target_link_libraries(main t)

执行结果:


image.png

系统环境变量

SET(ENV{CMAKE_INCLUDE_PATH} "hhhh")  #设置系统环境变量
message(STATUS "CMAKE_INCLUDE_PATH:" $ENV{CMAKE_INCLUDE_PATH}) #系统环境变量,使用ENV前缀
1S97DASDF@IDV1I$6GM28`9.png

也可以通过以下方式设置:


image.png

搜索所有的源文件

aux_source_directory(. SRC_LIST)  //当前目录查找,赋值给变量SRC_LIST
file(GLOB SRC_LIST1 "*.c")
file(GLOB SRC_LIST2 "*.c" "test/*.c") //file方式查找当前目录,test目录
file(GLOB SRC_LIST3 RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*.c") //输出相对于指定路径的结果
message(STATUS "SRC_LIST:" ${SRC_LIST})
message(STATUS "SRC_LIST1:" ${SRC_LIST1})
message(STATUS "SRC_LIST2:" ${SRC_LIST2})
message(STATUS "SRC_LIST3:" ${SRC_LIST3})
image.png

可以看到SRC_LIST1,SRC_LIST2都是绝对路径,SRC_LIST,SRC_LIST3是相对路径

设置包含的目录

一般作用是把头文件放到搜索路径下:

include_directories(test) 

hello.c里面头文件路径不用修改:

#include <stdio.h>
#include "test.h" //这里就不用绝对路径了
int main()
{
    printf("PI:%f\n",PI);
    printf("hello world:%d\n",add(1,5));
    return 0;
}

设置 target 需要链接的库

add_subdirectory(test) // test目录单独生成库文件
include_directories(test) 
add_executable(main ${SRC_LIST})
target_link_libraries(main t)  // 这里可以查找到libt.so

配置文件

配置一个头文件将一些 CMake 设置传入到源代码中,例如这里定义一个是否Debug的开关

option (DEBUG "debuggable" ON)  //这个变量定义一定写在前面
configure_file("${PROJECT_SOURCE_DIR}/config.h.in" "${PROJECT_BINARY_DIR}/config.h") //以 config.h.in 为模版,替换相关变量以生成 config.h

在指定目录新建一个文件config.h.in,这里文件名可以是其他的,最好有意义


image.png
#cmakedefine DEBUG  //这里使用#cmakedefine

执行cmake .. ,在build目录产生了config.h


W4PCB[]@2Z[`]_R_HDRURR4.png

内容如下:

#define DEBUG

可以在CMakeLists.txt中使用这个定义,也可以在源文件中使用:

option (DEBUG "debuggable" ON)
configure_file("${PROJECT_SOURCE_DIR}/config.h.in" "${PROJECT_BINARY_DIR}/config.h")
if(DEBUG)
  message(STATUS "DEBUG:" ${DEBUG})
endif(DEBUG)  

执行如下:


image.png

在源文件中使用:

#include <stdio.h>
#include "test.h"
#include "build/config.h" //引入头文件
int main()
{
    printf("PI:%f\n",PI);
    printf("hello world:%d\n",add(1,5));
    #ifdef DEBUG
    printf("debug:%d\n",1); //打印输出
    #endif
    return 0;
}

执行结果如下:


XS~01GV`6DU%T5NO2(3P_L5.png

设置编译类型

add_executable(demo demo.cpp) # 生成可执行文件
add_library(common STATIC util.cpp) # 生成静态库
add_library(common SHARED util.cpp) # 生成动态库或共享库

使用shell脚本

新建一个make.sh

#!/bin/bash
cd build
rm -rf *
cmake ..
make
./main

添加可执行权限:chmod u+x make.sh
执行结果:


H@H(5@VANPQGB32VX6(C3$Q.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容