cmakelist的作用及使用

2023-11-09

cmakelist的作用及使用

cpp平常的运行方式

cpp为编译型语言,需要把cpp文件编译成可执行文件

然后执行可执行文件

gcc main.cpp -o main

执行该可执行文件 ./main

但由于一些依赖错综复杂,且需要大量指令依次执行

还有在服务器上寻找库的原因,产生了makefile

Makefile 即为一个 顺序存了很多命令的文件。

我们执行make的时候,即运行makefile 按照顺序执行makefile里的指令

makefile的结构是这样的

目标:依赖目标

命令

makefile里默认一个目标就是一个文件

我们假如想要不生成这个文件,就要加上

.PHONY: 目标

使用make指令的时候,通常要加上各种参数,表明你想要的是哪个目标,比如

install:…

uninstall: …

make install 就会执行install

make uninstall 就会执行uninstall

直接 make 会自动执行第一个目标

但写makefile也是一个很繁杂的任务,这时cmake出现了

它作为一个跨平台的工具,可以帮助找资源,生成makefile

cmake一般的流程

首先 项目文件中一般会有一个 cmakelist

我们创建一个文件夹叫build(什么名字都可以),代表在这里生成可执行文件

在build路径下,执行cmake …

cmake会帮助链接好各个库,生成好makefile

再执行 make 指令,生成可执行文件

一个简单的cmakelist的样式

cmake_minimum_required(VERSION 2.6)
project(MY_PROJECT)

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

find_package(PCL 1.9.1 REQUIRED COMPONENTS common io geometry kdtree search features surface visualization filters)

file(GLOB SOURCES main.cpp)

add_executable(server ${SOURCES})
#include_directories(${CMAKE_SOURCE_DIR}/include)
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})

#include_directories("/opt/libjpeg-turbo/include")
#link_directories("/opt/libjpeg-turbo/lib")


include_directories(server ${PCL_INCLUDE_DIRS} )
target_link_libraries(server ${PCL_LIBRARIES} turbojpeg zstd)

SOURCES /home/eminem/pcl_test/main.cpp
PCL_LIBRARY_DIRS /usr/lib/x86_64-linux-gnu
PCL_DEFINITIONS -DDISABLE_PCAP;-DDISABLE_PNG;-DDISABLE_LIBUSB_1_0
PCL_INCLUDE_DIRS /usr/include/pcl-1.10;/usr/include/eigen3;/usr/include;/usr/include/ni;/usr/include/openni2;/usr/include/vtk-7.1;/usr/include/freetype2;/usr/include/x86_64-linux-gnu
PCL_LIBRARIES pcl_common;pcl_octree;pcl_io;pcl_kdtree;pcl_search;pcl_features;pcl_surface;pcl_visualization;pcl_sample_consensus;pcl_filters;/usr/lib/x86_64-linux-gnu/libboost_system.so;/usr/lib/x86_64-linux-gnu/libboost_filesystem.so;/usr/lib/x86_64-linux-gnu/libboost_date_time.so;/usr/lib/x86_64-linux-gnu/libboost_iostreams.so;/usr/lib/x86_64-linux-gnu/libboost_regex.so;optimized;/home/eminem/.conda/envs/myTorch/lib/libqhull_p.so;debug;/home/eminem/.conda/envs/myTorch/lib/libqhull_p.so;/usr/lib/libOpenNI.so;/usr/lib/libOpenNI2.so;vtkChartsCore;vtkCommonColor;vtkCommonCore;vtksys;vtkCommonDataModel;vtkCommonMath;vtkCommonMisc;vtkCommonSystem;vtkCommonTransforms;vtkCommonExecutionModel;vtkFiltersGeneral;vtkCommonComputationalGeometry;vtkFiltersCore;vtkInfovisCore;vtkFiltersExtraction;vtkFiltersStatistics;vtkImagingFourier;vtkImagingCore;vtkalglib;vtkRenderingContext2D;vtkRenderingCore;vtkFiltersGeometry;vtkFiltersSources;vtkRenderingFreeType;/usr/lib/x86_64-linux-gnu/libfreetype.so;/usr/lib/x86_64-linux-gnu/libz.so;vtkFiltersModeling;vtkImagingSources;vtkInteractionStyle;vtkInteractionWidgets;vtkFiltersHybrid;vtkImagingColor;vtkImagingGeneral;vtkImagingHybrid;vtkIOImage;vtkDICOMParser;vtkmetaio;/usr/lib/x86_64-linux-gnu/libjpeg.so;/usr/lib/x86_64-linux-gnu/libpng.so;/usr/lib/x86_64-linux-gnu/libtiff.so;vtkRenderingAnnotation;vtkRenderingVolume;vtkIOXML;vtkIOCore;vtkIOXMLParser;/usr/lib/x86_64-linux-gnu/libexpat.so;vtkIOGeometry;vtkIOLegacy;vtkIOPLY;vtkRenderingLOD;vtkViewsContext2D;vtkViewsCore;vtkRenderingContextOpenGL2;vtkRenderingOpenGL2;FLANN::FLANN

六 命令

project (HELLO)   #指定项目名称,生成的VC项目的名称;

使用${HELLO_SOURCE_DIR}表示项目根目录

file(GLOB SOURCES *.cpp)

将所有cpp文件 的绝对路径 都加入到 SOURCES 变量中

find_package(PCL 1.9.1 REQUIRED …) 找库

include_directories:指定头文件的搜索路径,相当于指定gcc的-I参数

include_directories (${HELLO_SOURCE_DIR}/Hello)  #增加Hello为include目录

link_directories:动态链接库或静态链接库的搜索路径,相当于gcc的-L参数

>> link_directories (${HELLO_BINARY_DIR}/Hello)     #增加Hello为link目录

add_subdirectory:包含子目录

>> add_subdirectory (Hello)

add_executable:编译可执行程序,指定编译,好像也可以添加.o文件

>> add_executable (helloDemo demo.cxx demo_b.cxx)   #将cxx编译成可执行文件——

add_definitions:添加编译参数

add_definitions(-DDEBUG)将在gcc命令行添加DEBUG宏定义;

add_definitions( “-Wall -ansi –pedantic –g”)

target_link_libraries:添加链接库,相同于指定-l参数

target_link_libraries(demo Hello) #将可执行文件与Hello连接成最终文件demo

add_library:

add_library(Hello hello.cxx)  #将hello.cxx编译成静态库如libHello.a

add_custom_target:

message( status|fatal_error, “message”):

set_target_properties( … ): lots of properties… OUTPUT_NAME, VERSION, …

link_libraries( lib1 lib2 …): All targets link with the same set of libs

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

cmakelist的作用及使用 的相关文章

随机推荐

  • LeetCode刷题笔记:669.修剪二叉搜索树

    1 问题描述 给你二叉搜索树的根节点 root 同时给定最小边界low 和最大边界 high 通过修剪二叉搜索树 使得所有节点的值在 low high 中 修剪树 不应该 改变保留在树中的元素的相对结构 即 如果没有被移除 原有的父代子代关
  • Chrome浏览器的跨域设置

    做前后端分离的开发的时候 出于一些原因往往需要将浏览器设置成支持跨域的模式 而且chrome浏览器支持可跨域的设置 但是新版本的chrome浏览器提高了跨域设置的门槛 原来的方法不再适用了 其实网上也有很多大神总结的chrome跨域设置教程
  • 去耦电容的选择举例

    在高速时钟电路中 尤其要注意元件的RF去耦问题 究其原因 主要是因为元件会把一部分能量耦合到电源 地系统之中 这些能量以共模或差模RF的形式传播到其他部件中 陶瓷片电容需要比时钟电路要求的自激频率更大的频率 这样可选择一个自激频率在10 3
  • JavaWeb酒店管理系统

    酒店管理系统 一 项目介绍 1 项目用到的技术栈 开发工具 idea 语言 java js html ajax 数据库 MySQL 服务器 Tomcat 框架 mybatis jQuery 2 项目实现功能 管理员和用户登录和退出功能以及用
  • ParameterizedType应用,java反射,获取参数化类型的class实例

    ParameterizedType是一个接口 这个类可以用来检验泛型是否被参数化 比如 class Dao
  • python https RecursionError详解

    RecursionError maximum recursion depth exceeded while calling a Python object File root miniconda3 envs devops lib pytho
  • Ubuntu下安装Pytorch

    安装CPU版本 https www cnblogs com wangqinze p 13407610 html 完成后检验是否有误 python import torch import torchvision 若没有报错则完成 安装GPU版
  • CMake I 设置语言标准

    目录 一
  • docker基础篇-docker的安装、配置、卸载,自定义镜像和搭建公有和私有镜像仓库

    本篇主要是docker的安装 配置 卸载 自定义镜像和搭建公有和私有镜像仓库 以及常规软件安装示例 mysql主从 redis主从搭建 Dockerfile解析及docker compose编排等见另一篇文章 docker高级篇 mysql
  • python之正则表达式:匹配ip地址

    首先分析ip地址的特征 255 255 255 255 1位 0 9 0 9 d 2位 10 99 1 9 d 2位以内 1 9 d 3位 100 199 1 d 2 3位 200 249 2 0 4 d 3位 250 255 25 0 5
  • 如何让opencv成为MATLAB中的一个工具箱

    如何让opencv成为MATLAB中的一个工具箱 前言 谈到图像处理的编程工具 MATLAB和opencv是最经常提到的 两者各有优缺点 比如 MATLAB的数据可视化做得很好 而且还有其它可以方便调用的工具箱 但是在图像的处理上面 不如o
  • IDEA快速生成方法

    快捷键 Alt Insert 按下快捷键之后会弹出如下界面 依次是Constructor方法 Getter方法 Setter方法 Getter 和Setter方法 equa 和 hashCode 方法 toString方法 Override
  • 三大通信协议(3)SPI——寄存器配置

    目录 一 SPI通信协议简介 二 SPI通信时序 1 主从通信 2 模式选择 三 实例 总结 一 SPI通信协议简介 SPI是串行外设接口 Serial Peripheral Interface 的缩写 是 Motorola 公司推出的一种
  • windows下expect使用小结

    最近因为学习tcl脚本语言 需要用到expect扩展包 结合网上的资料和自己的学习情况做一下整理 expect是一种基于TCL的解释型脚本语言 能够实现自动和交互式任务进行通信 而无需人的干预 expect由一系列expect send对组
  • SpringBoot结合MyBatis实现多数据源配置

    SpringBoot结合MyBatis实现多数据源配置 一 前提条件 1 1 环境准备 SpringBoot框架实现多数据源操作 首先需要搭建Mybatis的运行环境 由于是多数据源 也就是要有多个数据库 所以 我们创建两个测试数据库 分别
  • Unity【LayerMask】层级关系以及代码对层级的控制

    LayerMask的存储 LayerMask的每一个层级都是一个二进制数字 实际上LayerMash是32位的二进制记录的 每一个层级对应一个二进制位置 所以理论上Unity最多能有32个层级关系 为了方便解释以下列表假设只有5位二进制数据
  • Qt:FTP 与 QFtp 实现文件传输(C++: ftplib)

    目录 C 与 FTP 1 1 简介 1 2 工作原理 1 2 1 独特优势 1 2 2 基本模型 1 3 用户与传输 1 3 1 用户分类 1 3 2 传输方式 1 3 3 传输模式 1 4 控制命令 实现方式 2 1 QFtp 2 2 Q
  • eml文件是什么格式的文件?怎么打开?怎么导出eml文件?

    eml格式文件是一个电子邮件文件 其格式名由来是E mail 电子邮件 的缩写形式 一个eml文件打开后就是一封电子邮件 E mail 它是电子邮件导出后的格式 163 QQ等使用较多的邮件服务商都有邮件导出功能 导出后的文件就是eml格式
  • cmake的add_subdirectory

    命令格式 add subdirectory source dir binary dir EXCLUDE FROM ALL 添加一个子目录并构建该子目录 如果想同时编译多个CmakeLists txt 可以使用add subdirectory
  • cmakelist的作用及使用

    cmakelist的作用及使用 cpp平常的运行方式 cpp为编译型语言 需要把cpp文件编译成可执行文件 然后执行可执行文件 gcc main cpp o main 执行该可执行文件 main 但由于一些依赖错综复杂 且需要大量指令依次执