CMake的常用功能

message

项目目录:
在这里插入图片描述

这个是它的CMakeLists.txt

cmake_minimum_required(VERSION 3.16)
project(message)
message("参数1")
message("参数p1" "参数p2"  #[[注释在message中]] "p3" 123 测试)

执行编译命令就打印出了 “参数1”
在这里插入图片描述

message的高级使用-指定日志的级别

–log-level=<ERROR|WARNING|NOTICE|STATUS|VERBOSE|DEBUG|TRACE>
默认是只显示STATUS 这个状态


FATAL_ERROR    停止cmake运行和生成
SEND_ERROR    cmake 继续运行,生成跳过
WARING                print to stderr
(none) or NOTICE  printed to stderr
STATUS  项目用户可能感兴趣的信息
VERBOSE   针对项目用户的详细信息
DEBUG     项目本身的开发人员使用的信息
TRACE   非常低级别实现细节的细粒度的消息


cmake_minimum_required(VERSION 3.16)
project(message)
message("参数1")

# FATAL_ERROR 进程退出,生成退出 打印代码路径和行号 stderr ,出现了FATAL_ERROR 后面的就不会执行了
message(FATAL_ERROR "TEST FATAL_ERROR")  
message("参数p1" "参数p2"  #[[注释在message中]] "p3" 123 测试)
cmake_minimum_required(VERSION 3.16)
project(message)
message("参数1")

# FATAL_ERROR 进程退出,生成退出 打印代码路径和行号 stderr ,出现了FATAL_ERROR 后面的就不会执行了
message(SEND_ERROR  "TEST FATAL_ERROR")  
add_executable(test_message  test_message.cpp)
message("after error")

# WARNING 打印代码路径和行号 stderr
message(WARNING "TEST WARNING")

#NOTICE等同于 none也就是不加  message("TEST NOTICE")  stderr
message("TEST none")
message(NOTICE "TEST NOTICE")

#STATUS 加前缀 --  用户可能感兴趣 stdout
message(STATUS "TEST STATUS")

#VERBOSE 加前缀 -- 默认不显示 用户需要的详细信息 stdout
message(VERBOSE "TEST VERBOSE")



# 设置日志显示级别
# cmake -S . -B build --log-level=VERBOSE

# 标准输出重定向到文件log.txt 
# cmake -S . -B build --log-level=VERBOSE > log.txt 

# 标准错误输出重定向到标准输出 
# cmake -S . -B build --log-level=VERBOSE > log.txt  2>&1

#DEBUG 加前缀 --   ,有用的就是 这个debug
message(DEBUG  "test DEBUG")

#TRACE 加前缀 -- 
# cmake -S . -B build --log-level=TRACE
message(TRACE "test TRACE")

设置日志显示级别 cmake -S . -B build --log-level=VERBOSE

标准输出重定向到文件log.txt cmake -S . -B build --log-level=VERBOSE > log.txt

标准错误输出重定向到标准输出 cmake -S . -B build --log-level=VERBOSE > log.txt 2>&1

2.3 cmake set变量入门和示例

在这里插入图片描述

cmake_minimum_required(VERSION 3.20)
project(test_ver)
set(VAR1 "测试变量VAR1的值")
message("VAR1=" ${VAR1})             //   这个会打印        "VAR1= 测试变量VAR1的值"
message("VAR1 in string ${VAR1}")  //   这个会打印       "VAR1 in string 测试变量VAR1的值"
message("\${VAR1}=${VAR1}")


set(VAR2 "VAR1")
message("VAR2=" ${VAR2})
message("VAR2=" ${${VAR2}})

unset(VAR1)                                          //  这个表示取消 VAR1 这个变量
message("\${VAR1}=${VAR1}")               //   ${VAR1}前面加了个 \   这个斜杠表示转义

2.4 cmake 变量示例设置message消息颜色

在这里插入图片描述

cmake_minimum_required(VERSION 3.20)
project(message_color)
#[[
\033[1;31;40m    <!--1-高亮显示 31-前景色红色  40-背景色黑色-->
\033[0m          <!--采用终端默认设置,即取消颜色设置-->
显示方式  
0                终端默认设置
1                高亮显示
4                使用下划线
5                闪烁
7                反白显示
8                不可见

前景色            背景色           颜色
---------------------------------------
30                40              黑色
31                41              红色
32                42              绿色
33                43              黃色
34                44              蓝色
35                45              紫红色
36                46              青蓝色
37                47              白色
]]

string(ASCII 27 Esc)

# Esc[0;31m
set(R "${Esc}[0;31m")   #红色
#Esc[0m 
set(E "${Esc}[m" )      #结束颜色设置
set(B "${Esc}[1;34m")   #蓝色高亮
set(RB "${Esc}[1;31;40m") #红色字体黑色背景
message("${R}红色内容${E} 默认颜色")
message("${B}蓝色内容${E} 默认颜色")
message("${RB}红色字体黑色背景${E} 默认颜色")
2.5 cmake_include

方法1:

从给定的文件中读取CMake的列表文件。
include( file [OPTIONAL] [RESULT_VARIABLE VAR] )
从给定的文件中读取CMake的清单文件代码。在清单文件中的命令会被立即处理。如果指定了OPTIONAL选项,但是被包含文件不存在的话,不会报错。 如果指定了RESULT_VARIABLE选项,那么var或者会被设置为被包含文件的完整路径,或者是NOTFOUND 表示没有找到该文件

方法2:这个是用包含cmake文件的方式
在这里插入图片描述

在这里插入图片描述

CMakeLists.txt

#107cmake_include/CMakeLists.txt
cmake_minimum_required(VERSION 3.20)
project("cmake_include")
message("begin include")

include("cmake/test_cmake.cmake")
include("cmake/test_cmake.cmake")     #  这种的文件不存在会报错的,编译进行不下去,直接退出了.   如果cmake目录下没有test_cmake 这个文件那么就直接退出了
include("cmake/test_cmake1.cmake" OPTIONAL) #    “”OPTIONAL”  表示可选的意思,文件不存在的话不报错
include("cmake/test_cmake1.cmake" OPTIONAL  RESULT_VARIABLE ret) # RESULT_VARIABLE 返回值,是否引用成功
message("RESULT_VARIABLE ret= ${ret}") #NOTFOUND
include("cmake/test_cmake.cmake" OPTIONAL  RESULT_VARIABLE ret)
message("RESULT_VARIABLE ret= ${ret}") #导入文件的绝对路径

message("end include")

test_cmake.cmake

#107cmake_include/cmake/test_cmake.cmake
message("in cmake/test_cmake.cmake")

2.7cmake自带的四种变量和给c++传递变量演示

在这里插入图片描述

CMakeLists.txt

#106cmake_system_ver/CMakeLists.txt
cmake_minimum_required(VERSION 3.20)
project(xlog)
#1 提供信息的变量  项目名称 ${PROJECT_NAME}对应project的name
#2 改变行为的变量 BUILD_SHARED_LIBS       ON 生成的是动态库      OFF静态库 默认OFF
#set(BUILD_SHARED_LIBS ON)   动态库的时候会生成这个  xlog_EXPORTS  宏,xlog.h里的xlog_EXPORTS是设置成ON的时候动态生成的
set(BUILD_SHARED_LIBS OFF) #静态库

#cmake传递变量给c++
add_definitions(-Dxlog_STATIC) #默认值1   ,把xlog_STATIC 这个标志传递给xlog.h 就会走这个if  "ifdef xlog_STATIC"

#3 描述系统的变量
message("MSVC = " ${MSVC})
message("WIN32 = " ${WIN32})
message("UNIX = " ${UNIX})
message("CMAKE_SYSTEM_NAME = " ${CMAKE_SYSTEM_NAME})

# 4 控制构建过程的变量 输出路径控制 CMAKE_COLOR_MAKEFILE 是否生成makefile的颜色,默认是ON
set(CMAKE_COLOR_MAKEFILE OFF)


add_library(${PROJECT_NAME} xlog.cpp xlog.h)

xlog.h

#ifndef XLOG_H
#define XLOG_H
//__declspec(dllexport)
//__declspec(dllexport) 导出XLog类的函数到lib文件中
// xlog库文件调用 dllexport
// test_xlog 调用 dllimport
#ifndef _WIN32 //linux mac unix Android
    #define XCPP_API
#else //windows
    #ifdef xlog_STATIC  //静态库
        #define XCPP_API
    #else               //动态库
        #ifdef xlog_EXPORTS
            #define XCPP_API __declspec(dllexport) //库项目调用
        #else
            #define XCPP_API __declspec(dllimport) //调用库项目调用
        #endif
    #endif
#endif
class XCPP_API XLog
{
public:
	XLog();
};
#endif

xlog.cpp

#include "xlog.h"
#include <iostream>
using namespace std;
XLog::XLog()
{
	cout<<"Create XLog"<<endl;
}

cmake 内建变量:
提供信息的变量 PROJECT_NAME project()项目名称
改变行为的变量 BUILD_SHARED_LIBS (缓存变量, add_library() , ON , OFF)
描述系统的变量 MSVC WIN32 ANDROID UNIX CMAKE_SYSTEM_NAME
控制构建过程的变量 CMAKE_COLOR_MAKEFILE ,

    http://cmake.org.cn/cmake_html/manual/cmake-variables.7.html

2.13 cmake调试打印生成具体指令

cmake 调试打印生成的具体指令:

   方案1: CMAKE_VERBOSE_MAKEFILE
    方案2: cmake    --build .  v                         使用命令后面加参数v来打印指令

方案1:

cmake_minimum_required(VERSION 3.20)
project(first_cmake)
# 显示详细的生成日志,默认是OFF
set(CMAKE_VERBOSE_MAKEFILE  ON)

2.10 cmake 自动载入项目源码和文件 2-11 CMake file自动导入头文件到项目

自动查找所有源码文件和头文件可以增加头文件和代码后不用修改cmake.
方式1: axu_source_directory
方式2: file


aux_source_directory("./src"  LIB_SRCS)    把当前src目录下是所有源码存入变量 DIR_SRCS 

FILE (GLOB  H_FILE  "${INCLUDE_PATH}/xcpp/*.h")      操作方式是GLOB  , 把这个路径 “${INCLUDE_PATH}/xcpp/*.h” 下的头文件存入 H_FILE 这个变量里

FILE (GLOB  H_FILE_I  "${INCLUDE_PATH}/*.h")

在这里插入图片描述

文件目录结构
#[[
108auto_src_h
    CMakeLists.txt
    main.cpp
    src
        xlog.cpp
        xthread.cc
        xtest.c
    include
        xlog.h
        xthread.hpp
]]

根目录的CMakeLists.txt

cmake_minimum_required(VERSION 3.20)
project("auto_src_h")

#头文件加载路径, 把头文件存到这个变量里  “INCLUDE_PATH  ”
set(INCLUDE_PATH  "./include")
include_directories(${INCLUDE_PATH})

# 找到当前目录(.)下源码写入M_SRC变量中
aux_source_directory("." M_SRC)

# 找到  当前目录 src 下的源码文件, 存到SRC中
aux_source_directory("./src" SRC)

#读取所有的头文件,  看看,这里用到了 上面定义的 INCLUDE_PATH
# 这样以后我们的项目从include下添加头文件从src目录下查找源文件就会自动查找
#有多个头文件,下面这个函数就写多次,每个都是不同变量
file(GLOB H_FILE "${INCLUDE_PATH}/*.h*")

add_executable(${PROJECT_NAME} ${M_SRC} ${SRC} ${H_FILE})


main.cpp

#include <iostream>
#include "xlog.h"
#include "xthread.hpp"
using namespace std;
int main()
{
    xlog();
    xthread();
	cout<<"test auto source head"<<endl;
	return 0;
}

src / xlog.cpp

#include <iostream>
#include "xlog.h"
using namespace std;
void xlog()
{
	cout<<" In xlog"<<endl;
}

src / xtest.c

void test()
{
}

src/ xthread.cc

#include <iostream>
using namespace std;
void xthread()
{
	cout<<"In xthread"<<endl;
}

include/xlog.h

#ifndef XLOG_H
#define XLOG_H
void xlog();
void testxlog(){}
#endif

include/xthread.hpp

#ifndef XTHREAD_H
#define XTHREAD_H
void xthread();
#endif

2.12 cmake命令实现程序的分步生成

预处理: 预处理完后会生成多个.c .cpp文件, 全是源码文件不包含头文件
编译:
汇编: 编译完了生成汇编,然后生成二进制文件
链接:把二进制文件和资源文件链接成一个执行程序或者库
运行:

以101first_cmake 为例子:
在这里插入图片描述

first_cmake.cpp

#include <iostream>
using namespace std;
int main(int argc,char *argv[])
{
    cout<<"first CMake TEST"<<endl;
    return 0;
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.20)

#构建项目的名称
project(first_cmake)

#构建执行程序
add_executable(first_cmake 101first_cmake.cpp)

要生成namke项目才能单独处理,不然在window下直接生成项目了

cmake  -S . -B  build   -G  "NMake Makefiles"

在这里插入图片描述

进入 build 目录

查看生成的所有目录
cmake --build .  --target  help

在这里插入图片描述

查看预处理文件,预处理生成的是 .i文件

cmake --build .  --target 101first_cmake.i

在这里插入图片描述

查看编译文件, 101first_cmake.s 这里是所有的汇编代码

cmake --build .  --target 101first_cmake.s

在这里插入图片描述
查看汇编文件

win下
cmake --build .  --target 101first_cmake.obj
linux下
cmake --build .  --target 101first_cmake.o

在build目录下 执行 make clean 就是清理项目

cmake --build . 先构建项目,看到目录下生成了 first_camke.exe

在这里插入图片描述

执行  cmake --build . --target  clean  会清理掉first_cmake.exe

2-15 cmake add_subdirectory

CMake 设置输出路径 add_subdirectory

cmake_minimum_required(VERSION 3.20)
project(xlog)
include_directories("xlog")

#CMakeLists.txt路径
message("CMAKE_CURRENT_LIST_DIR = ${CMAKE_CURRENT_LIST_DIR}")
# .so库输出路径 默认路径在-B build目录下
# 当前路径 src/109   lib/
#set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/../../lib")
#linux .so输出路径
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/lib")

#执行程序和dll 动态库pdb调试文件 输出路径
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/bin")

#归档输出路径 静态库 .lib 动态库.lib地址文件 linux静态库.a 静态库pdb调试文件
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/lib")

#添加xlog库编译 项目自带预处理变量 xlog_EXPORTS
#add_library(xlog SHARED xlog/xlog.cpp)

#set(BUILD_SHARED_LIBS OFF) #静态库
#cmake传递变量给c++
#add_definitions(-Dxlog_STATIC) #默认值1

set(BUILD_SHARED_LIBS ON) #动态库

add_subdirectory("xlog")
add_subdirectory("test_xlog")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值