CMakeLists.txt编写
文件夹:
C:.//tree
├─.vscode
├─build
├─include
└─src
内容:
cmake_minimum_required(VERSION 3.0)
指定编译该工程对cmake的最低版本要求,若CMake的运行版本低于所需版本,将停止处理项目并报告错误
Project(Hello)
此句加入两个变量
Hello_BINARY_DIR
,
Hello_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 指定编译器为
gcc
和
g++
#加入调试信息
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_DEBUG
和
CMAKE_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_package
和
find_library
指令可以得到库文件的绝对路径。不过你自己写的动态库文件放在自己新建的目录下时,可以用该指令指定该目录的路径以便工程能够找到。
target_link_libraries([target] [item] ...)#item不添加后缀名
指令中
target
是指通过
add_executable()
和
add_library()
指令生成的目标文件。
默认情况下,库依赖项是传递的。当这个目标链接到另一个目标时,链接到这个目标的库也会出现在另一个目标的连接线上。这个传递的接口存储在
interface_link_libraries
的目标属性中,可以通过设置该属性直接重写传递接口。