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")