CMake学习笔记(一)

CMakeLists.txt编写

文件夹:

C:.//tree
├─.vscode
├─build
├─include
└─src

内容:

cmake_minimum_required(VERSION 3.0)

指定编译该工程对cmake的最低版本要求,若CMake的运行版本低于所需版本,将停止处理项目并报告错误

Project(Hello)

此句加入两个变量Hello_BINARY_DIRHello_SOURCE_DIR,等价于变量:PROJECT_BINARY_DIR, PROJECT_SOURCE_DIR

MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] “message to display”…)

message("1.PROJECT_BINARY_DIR = ${PROJECT_BINARY_DIR}")
message("2.PROJECT_SOURCE _DIR = ${_DIR}")
message("3.CMAKE_CURRENT_SOURCE_DIR = ${CMAKE_CURRENT_SOURCE_DIR}")

MESSAGE指令用于向终端输出用户定义的信息,包含了五种类型:
STATUS = ‘非重要’消息;–>‘常用’
WARNING= CMake ‘警告’, 会继续执行;
AUTHOR_WARNING = CMake 警告 (dev), 会’继续’执行;
SEND_ERROR = CMake 错误, ‘继续执行’,但是会’跳过生成的步骤’;–>‘常用’
FATAL_ERROR = CMake错误, '终止所有’处理过程; -->‘常用’

set(CMAKE_C_COMPILER "gcc")
set(CMAKE_CXX_COMPILER "g++")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17 -pthread")# 设置c++的版本并添加多线程的使用

CMake 指定编译器为gccg++

#加入调试信息
set(CMAKE_BUILD_TYPE "Debug")
set(CMAKE_C_FLAGS "$ENV{CFLAGS} -O0 -Wall -g -lm -fPIC") #C
set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb -fPIC") #C++
set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall -fPIC") #C++

CMake 中有一个变量 CMAKE_BUILD_TYPE ,可以的取值是 Debug、Release、RelWithDebInfo >和 MinSizeRel。当变量值为 Debug ,CMake 会使用变量 CMAKE_CXX_FLAGS_DEBUGCMAKE_C_FLAGS_DEBUG 中的字符串作为编译选项生成 Makefile。
fPIC的全称是 Position Independent Code, 用于生成位置无关代码,作用是保证代码段的内容可以多进程相同,实现共享。

include_directories(./include)

将指定目录添加到编译器的头文件搜索路径之下,指定的目录被解释成当前源码路径的相对路径

aux_source_directory(./src DIR_SRCS)

查找src目录下的所有源文件,并将名称保存到DIR_SRCS的变量中

add_executable(Hello ${DIR_SRCS})#将DIR_SRCS内所有源文件生成可执行文件
add_library(${PROJECT_NAME} STATIC  hello.c})#生成静态库
add_library(${PROJECT_NAME} SHARED  hello.c})#生成动态库

add_library指令是将指定的源文件生成链接,然后添加到工程中去。
Windows下,静态库后缀名为.lib,动态库后缀名为.dll

link_directories(lib)

该指令为指定要链接的库文件的路径。当使用find_packagefind_library指令可以得到库文件的绝对路径。不过你自己写的动态库文件放在自己新建的目录下时,可以用该指令指定该目录的路径以便工程能够找到。

target_link_libraries([target]  [item] ...)#item不添加后缀名

指令中 target 是指通过add_executable()add_library() 指令生成的目标文件。
默认情况下,库依赖项是传递的。当这个目标链接到另一个目标时,链接到这个目标的库也会出现在另一个目标的连接线上。这个传递的接口存储在 interface_link_libraries的目标属性中,可以通过设置该属性直接重写传递接口。

你可能感兴趣的:(CMake,C语言,VScode,学习,vscode,c语言)