CMake学习笔记(一)

  • Post author:
  • Post category:其他




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

的目标属性中,可以通过设置该属性直接重写传递接口。



版权声明:本文为weixin_46777141原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。