首页 > 其他分享 >简单的cmake使用

简单的cmake使用

时间:2024-10-12 16:49:52浏览次数:8  
标签:set cmake 简单 LIBRARY OpenCV add 使用 cpp

使用CMakeLists.txt生成可执行文件

编写一个最简单的CMakeLists以生成可执行文件,仅需要以下三步

  • 指明最小支持的cmake版本 cmake_minimum_required
  • 指明项目的代号或者说名称project
  • 使用add_executable来生成可执行文件

其中

add_executable参数为可执行文件名称,后面跟着源文件列表
例如
add_executable(hello main.cpp add.cpp ......)

库的生成与链接

在执行add_executable后,若想使用一些外部库,则需要链接库文件来将库和可执行文件链接起来。

add_library(${LIBRARY_NAME} 可选参数 ${LIBRARY_SOURCES})

使用add_library用于通过源文件生成库文件,${LIBRARY_NAME}为库的名称,${LIBRARY_SOURCES}为库的源文件列表。其中中间有些可选参数。如STATIC表示生成静态库,SHARED表示生成动态库。

然后在add_executable后使用target_link_libraries来链接库文件。

target_link_libraries(hello ${LIBRARY_NAME})

这里${LIBRARY_NAME}为库的名称,可以是系统库,也可以是自己编译的库。
对于.so后缀的动态库以及.a后缀的静态库,以及以lib为前缀的库文件,只需要写其名称即可,不需要写后缀以及lib前缀。

注意的是,如果是自己编译的库一般会找不到,因为target_link_libraries仅从指定路径/usr/bin/ld中寻找库,若是自己的库可以选择软链接到该路径或者填写绝对路径

外部依赖库的使用

对于不是自己编译的库,可以使用find_package命令来查找系统中已安装的库。

find_package(库名称 REQUIRED)

这里的库名称可以是OpenCVBoostEigen等等。而REQUIRED参数使得当未找到该库时,会直接推出make而报错。

对于库名称,在安装库时,库会同时安装一份XXXXConfig.cmake或者findxxxx.cmake文件,该文件包含了库的相关信息,包括头文件路径、库文件路径、依赖库等。所以库名称匹配的就是这个XXXX。而使用find_package命令时,CMake会在系统路径下查找该文件,并读取其信息,从而找到库的相关信息。同时在该文件中也规定或者定义了库的一些变量,比如库的路径、头文件路径等。

以OpenCV为例,在CMakeLists.txt中使用如下命令:

cmake_minimum_required(VERSION 3.6)

project(simple_cmake)

find_package(OpenCV REQUIRED)

include_directories(${OpenCV_INCLUDE_DIRS})

add_executable(hello main.cpp add.cpp)

target_link_libraries(hello ${OpenCV_LIBS})

其中${OpenCV_INCLUDE_DIRS}以及${OpenCV_LIBS}是OpenCVConfig.cmake中定义的变量,分别表示头文件路径和库文件路径。可以使用message命令打印这些变量的值来验证。如

message(OpenCV_LIBS)

而对于一些未显式给出的库如TensorRT,大可以自己去写一份FindTensorRT.cmake文件,然后使用find_package命令查找,正如上交所做。

变量的使用

CMakeLists.txt中可以使用变量来简化代码,提高可读性。
使用set命令可以定义并初始化变量。
set(变量名 值)
这里的值可以是字符串、数字等,可以有多个值,用空格隔开。

set(SRC_FILES main.cpp add.cpp)

add_executable(hello ${SRC_FILES})

target_link_libraries(hello ${LIBRARY_NAME})

这里${SRC_FILES}是一个变量,其值为main.cppadd.cpp,可以简化代码。
SRC_FILES是变量名,而使用$代表取其值,这一点和shell命令类似。

指定编译选项

  • 指定编译模式
set(CMAKE_BUILD_TYPE Debug|Release)
  • 指定编译器路径
set(CMAKE_CXX_COMPILER /usr/bin/g++)
  • 指定编译选择的c++标准
set(CMAKE_CXX_STANDARD 11)
or
set(CMAKE_CXX_FLAGS "std=c++11 -O3")

等等

标签:set,cmake,简单,LIBRARY,OpenCV,add,使用,cpp
From: https://www.cnblogs.com/CrescentWind/p/18460868

相关文章

  • HelixToolkit使用教程
    HelixToolkit使用总结:问题点:    3d光源    相机    网格信息1、配置HelixViewPort3d基本参数2、配置相机参数和相机位置:HelixViewPort3D.DefaultCamera    设置相机的放置方向和观看位置<hv:HelixViewport3D.DefaultCamera>......
  • 如何使用helixtoolkit对Mesh3D的每个点进行不同的着色?
    首先,HelixToolkit是一个开源的3D图形库,可以用于在WPF应用程序中创建交互式的3D视觉效果。而Mesh3D是HelixToolkit中用于呈现3D网格的类。要对Mesh3D的每个点进行不同的着色,可以通过以下步骤实现:创建一个用于呈现Mesh3D的场景。可以使用HelixViewport3D控件来承载3D场景。定义......
  • github action的使用
    近年来,我一直在使用jenkins来部署自己的项目,发现太耗内存了,因此将自动化部迁的操作改为使用githubaction。初始化action配置选择一个合适的action类型,比如webpack、gitPage、Nodejs等等。比如我这里选择了webpack,选择完成后可以看到在仓库里多了一个文件.github/workflo......
  • Express的使用笔记3 中间件
    日志中间件//挂载会每个接口都执行这段代码app.use((req,res,next)=>{console.log(req.method,req.url,Date.now())next()//下一个中间件})2.中间件的顺序很重要如果有一个普通接口写在上面代码之前,那么就不会进入上面的函数中但是如果在接口中第二个回调......
  • 使用Lua语言破解滑块验证码的完整流程解析
    本文将使用Lua语言来破解滑块验证码,带领大家一步步实现验证码破解,包括获取图片、计算滑块移动距离、生成滑动轨迹等。下载验证码图片首先,我们要获取滑块的前景图片和背景图片。使用Lua中的socket.http来进行HTTP请求并下载图片。lualocalhttp=require("socket.ht......
  • C# 使用反射机制适配多个不同供应商提供的可统一接口化的行为(方法)
    1、定义一个接口(IMedicareControlFee)定义行为;定义一个适配器(IMedicareControlFeeAdapter)可应对多厂商(多态);usingSystem;usingSystem.Diagnostics;usingSystem.IO;usingJetSun.Infrastructure;usingJetSun.Infrastructure.Services;usingMicrosoft.Practices.Unity;usi......
  • 基于FIFO使用UART实现FPGA板与PC通信
    基于FIFO使用UART实现FPGA板与PC通信1.UART简介UART(通用异步收发传输器)是一种常用的串行通信协议,广泛用于FPGA与外部设备(如PC、传感器等)之间的通信。UART通信的核心是将并行数据转换为串行数据传输,然后在接收端再将串行数据恢复为并行数据。UART协议特点:异步通信:无需时钟......
  • python redis使用教程
    文章目录安装Redispython安装redis库使用Python连接Redis使用Redis实现缓存Redis中的常用缓存操作Redis缓存策略发布与订阅事务安装RedisRedisWindows最新安装教程(2024.10.10)python安装redis库pipinstallredisE:\Redis-x64-3.2.......
  • Doris FE内存占用持续上升直至无法使用
    环境操作系统:CentOSLinuxrelease7.6.1810(Core)Doris版本:doris-2.1.5-bin-x64Java版本:jdk1.8.0_1813台机器组成的集群所在场景做大数据项目时使用Doris的catalog将来自不同主机的多个MySQL库相同的表数据汇总到另一个主机的MySQL库,就注册了多个catalog用于连接不同的......
  • Springboot --- 使用国内的 AI 大模型 对话
    实在是不知道标题写什么了可以在评论区给个建议哈哈哈哈先用这个作为标题吧尝试使用国内给出的AI大模型做出一个可以和AI对话的网站出来使用智普AI只能在控制台中输出对应的信息不如就做一个maven的项目调用对应的APIhttps://open.bigmodel.cn/dev/api#gl......