首页 > 系统相关 >linux中cmake的用法

linux中cmake的用法

时间:2023-11-19 16:13:11浏览次数:41  
标签:cmake SRCS 用法 PROJECT SOURCE linux hello DIR

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)

标签:cmake,SRCS,用法,PROJECT,SOURCE,linux,hello,DIR
From: https://www.cnblogs.com/ran7/p/17842162.html

相关文章

  • Qt项目中CMakeLists.txt文件
    cmake_minimum_required(VERSION3.5)project(testNameLANGUAGESCXX)set(CMAKE_AUTOUICON)set(CMAKE_AUTOMOCON)set(CMAKE_AUTORCCON)set(CMAKE_CXX_STANDARD17)set(CMAKE_CXX_STANDARD_REQUIREDON)find_package(Qt5COMPONENTSREQUIREDWidgetsSqlCharts......
  • SQL 的 AND、OR 和 NOT 运算符:条件筛选的高级用法
    AND运算符SQL的AND运算符用于根据多个条件筛选记录,确保所有条件都为TRUE才返回记录。下面是AND运算符的基本语法:SELECTcolumn1,column2,...FROMtable_nameWHEREcondition1ANDcondition2ANDcondition3...;column1,column2,等是您要选择的列名称。table_name是您......
  • Linux第七次周总结
    第六章I/O重定向与管道6.1I/O重定向打开一个终端0,输入date命令,会显示当前时间。如果在date命令后加“>”,并指向date.txt文件,那么就会写入date.txt文件。在执行passwd命令改密码时,系统会产生一个进程。date命令在默认情况下将输出结果显示在终端,此时文件描述符为1。现在改变......
  • linux命令学习
    Linux命令的学习导航目录Linux命令的学习导航使用VMware备份操作系统快照克隆Linux系统的文件文件与文件夹Linux系统的文件目录结构Linux的基本指令指令与选项基础指令ls指令pwd指令cd命令mkdir指令touch指令cp指令mv指令rm指令vim命令输出重定向cat指令进阶指令df指令free指令h......
  • SQL 的 AND、OR 和 NOT 运算符:条件筛选的高级用法
    AND运算符SQL的AND运算符用于根据多个条件筛选记录,确保所有条件都为TRUE才返回记录。下面是AND运算符的基本语法:SELECTcolumn1,column2,...FROMtable_nameWHEREcondition1ANDcondition2ANDcondition3...;column1,column2,等是您要选择的列名称。table_name是......
  • Linux下荣耀MagicBook的触控板被错误识别为鼠标的临时解决方案
    TL;DR安装软件包hid-tools,然后运行命令:sudohid-featureset-f300003$(sudohid-featurelist-devices|grepBLTP7853|awk-F:'{print$1}')问题现象荣耀MagicBook笔记本安装了汇顶的触控板,此触控板在Linux下被识别为鼠标,导致无法使用触控板手势等功能。该触控板......
  • 第十一周Linux教材第十二章学习笔记——块设备I/O和缓冲区管理
    块设备I/O和缓冲区管理本章讨论了块设备1/O和缓冲区管理;解释了块设备1/O的原理和T/O缓冲的优点;论述了Unix的缓冲区管理算法,并指出了其不足之处;还利用信号量设计了新的缓冲区管理算法,以提高1/O缓冲区的缓存效率和性能;表明了简单的PV算法易于实现,缓存效果好,不存在死锁和饥饿问题;还......
  • 在Linux环境安装redis步骤,且设置开机自动启动redis
    原创/朱季谦最近一直在学习redis相关知识,看了很多理论知识后,觉得还是要多动手操作,就如王阳明说的知行合一那样,因此,便决定在linux环境安装了redis,过程捣鼓了一番,也遇到了一些波折,但最后还是成功安装完成,顺便把步骤流程记录了下来,分享给有需要的小伙伴。1.首先,我在linux的/usr/local/......
  • linux环境安装可操作图库语言Gremlin的图框架HugeGraph
    原创/朱季谦 若你还没接触过图数据库,可能看到这个概念时,会比较蒙蔽。图是什么?图数据库又是什么?首先,在数据结构中,图是一种由顶点(vertex)集合及顶点间关系集合组成的一种非线性数据结构。而图数据库,则是以图这种具有点边结构来增、删、改、查之类操作的NoSQL数据库,它特别擅长处理大数......
  • Linux信号基本概念
    信号分为两大类:标准信号,用于内核向进程通知事件,信号范围为1~31实时信号信号产生后,会在稍后被传递给某进程,进程也会采取某措施来响应信号。在产生和到达期间,信号处于pending(等待)状态。有时需要确保一段代码不被传递来的信号所中断,这时可以把信号添加到进程的信号掩码中,阻塞......