linux中cmake的用法

发布时间 2023-11-19 16:04:18作者: 知秋_7

cmake的基本用法

一、message()函数

message :为用户显示一条消息

message( [STATUS|WARNING|AUTHOR_WARNING|FATAL_ERROR|SEND_ERROR]
  "message to display" ...)

# (无) = 重要消息;
# STATUS = 非重要消息;
# WARNING = CMake 警告, 会继续执行;
# AUTHOR_WARNING = CMake 警告 (dev), 会继续执行;
# SEND_ERROR = CMake 错误, 继续执行,但是会跳过生成的步骤;
# FATAL_ERROR = CMake 错误, 终止所有处理过程;

1.输出错误 FATAL_ERROR


message(FATAL_ERROR "
FATAL: In-source builds are not allowed.
       You should create a separate directory for build files.
")

2.输出警告 WARNING


message(WARNING "OpenCV requires Android SDK tools revision 14 or newer.")

3.输出正常 STATUS


message(STATUS "Can't detect runtime and/or arch")

4.输出变量的值

在cmake定义了一个变量“USER_KEY”,并打印此变量值。status表示这是一般的打印信息,我们还可以设置为“ERROR”,表示这是一种错误打印信息。


SET(USER_KEY, "Hello World")
MESSAGE( STATUS "this var key = ${USER_KEY}.")

二、“ PROJECT_BINARY_DIR ” 和 “ PROJECT_SOURCE_DIR ”

目录结构:

在这里插入图片描述

" PROJECT_BINARY_DIR " 是CMake生成一系列文件的目录,包括MakeFile等文件,如果你是让他们生成在build目录中就是 .../helloProject/build

" PROJECT_SOURCE_DIR "是顶级的CMakeLists.txt所在的目录,也就是 .../helloProject 目录

三、CMake 同一目录,多个源文件

目录结构:

在这里插入图片描述

# CMake 最低版本号要求
cmake_minimum_required(VERSION 3.5)

# 设置工程名
project (hello_cmake)

# 添加include头文件目录
include_directories(${PROJECT_SOURCE_DIR}/include)

# 查找当前目录下的所有源文件
# 并将名称保存到 DIR_SRCS 变量
aux_source_directory(${PROJECT_SOURCE_DIR}/src DIR_SRCS)

# 指定生成目标
add_executable(hello_cmake ${DIR_SRCS})


四、CMake 多个源文件,多个目录

目录结构:

在这里插入图片描述

# CMake 最低版本号要求
cmake_minimum_required(VERSION 3.5)

# 设置工程名
project (hello_cmake)

# 填加文件搜索目录(包含头文件)
aux_source_directory(${PROJECT_SOURCE_DIR} DIR_MAIN_SRCS)

aux_source_directory(${PROJECT_SOURCE_DIR}/hello DIR_HELLO_SRCS)

aux_source_directory(${PROJECT_SOURCE_DIR}/world DIR_WORLD_SRCS)

# 指定生成目标
add_executable(hello_cmake ${DIR_MAIN_SRCS} ${DIR_HELLO_SRCS} ${DIR_WORLD_SRCS})


目录结构:

在这里插入图片描述

一共有3个CMakeLists.txt

一个顶级CMakeLists.txt,放在当前工程的根目录下:

# CMake 最低版本号要求
cmake_minimum_required(VERSION 3.5)

# 设置工程名
project (hello_cmake)

aux_source_directory(. DIR_SRCS)

# 添加头文件路径
include_directories("${PROJECT_SOURCE_DIR}/hello")
include_directories("${PROJECT_SOURCE_DIR}/world")

# 添加 hello 子目录
add_subdirectory(hello)

# 添加 world 子目录
add_subdirectory(world)

# 指定生成目标
add_executable(hello_cmake main.cpp)

# 添加链接库
target_link_libraries(hello_cmake hello world)


hello文件夹中的CMakeLists.txt

aux_source_directory(. DIR_LIB_SRCS)

# 生成链接库
add_library (hello ${DIR_LIB_SRCS})

world文件夹中的CMakeLists.txt

aux_source_directory(. DIR_LIB_SRCS)

# 生成链接库
add_library (world ${DIR_LIB_SRCS})

五、CMake 在Linux上编译生成动态库和静态库

目录结构:

在这里插入图片描述

# 设置CMake最低版本
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)

# 设置目标链接库文件的存放位置
SET(LIBRARY_OUTPUT_PATH "${PROJECT_BINARY_DIR}/lib")

# 添加源文件目录
AUX_SOURCE_DIRECTORY(${PROJECT_SOURCE_DIR}/src DIR_SRCS)

# 添加头文件目录
INCLUDE_DIRECTORIES("${PROJECT_SOURCE_DIR}/include")

# 生成动态库
ADD_LIBRARY(hello SHARED ${DIR_SRCS})

# 生成静态库
ADD_LIBRARY(hello_static STATIC ${DIR_SRCS})

六、CMake 在Linux上使用动态库和静态库

1、使用动态库

目录结构:

在这里插入图片描述

cmake_minimum_required (VERSION 2.6)

project(hello_cmake)

# 头文件目录
include_directories(${PROJECT_SOURCE_DIR}/include)

# 生成可执行文件
add_executable(hello_cmake main.cpp)

# 链接库到可执行文件
target_link_libraries(hello_cmake ${PROJECT_SOURCE_DIR}/dynamic/libhello.so)


或者写成

cmake_minimum_required (VERSION 2.6)

project(hello_cmake)

# 头文件目录
include_directories(${PROJECT_SOURCE_DIR}/include)

# 添加动态库目录
LINK_DIRECTORIES(${PROJECT_SOURCE_DIR}/dynamic)

# 生成可执行文件
add_executable(hello_cmake main.cpp)

# 链接库到可执行文件
target_link_libraries(hello_cmake libhello.so)

# 链接库到可执行文件,以下三种写法是相同的:
# target_link_libraries(myProject libhello.so)  #这些库名写法都可以。
# target_link_libraries(myProject hello)
# target_link_libraries(myProject -lhello)

2、使用静态库

cmake_minimum_required (VERSION 2.6)

project(hello_cmake)

# 头文件目录
include_directories(${PROJECT_SOURCE_DIR}/include)

# 添加静态库目录  
LINK_DIRECTORIES(${PROJECT_SOURCE_DIR}/static)

# 生成可执行文件
add_executable(hello_cmake main.cpp)

# 链接库到可执行文件
target_link_libraries(hello_cmake libhello_static.a)

# 链接库到可执行文件,以下三种写法都是可以的
# target_link_libraries(hello_cmake libhello_static.a)
# target_link_libraries(hello_cmake hello_static.a)
# target_link_libraries(hello_cmake hello_static)