首页 > 编程语言 >C++_Cmake的使用

C++_Cmake的使用

时间:2023-10-24 14:12:36浏览次数:37  
标签:文件 cmake C++ 编译 add library 使用 Cmake find

C++

系统版本、软件依赖版本、组件
  LSB(全称:Linux Standards Base) LSB 
     shared object
 ELF是 Executable Linkable Format的缩写,是Linux的链接、可执行、共享库的格式标准,
   COFF:CommonObjectCOFF(通用对象文件格式)	 
编译器:

简单构建
  gcc编译流程分为4个步骤,分别为: 预处理(Pre-Processing) 编译(compiling) 汇编(Assembling) 链接(Linking)

构建工具
   0.软件开发商编写检测程序--config 或者configure
   1.执行configure  ---> 生成 Makefile文件
   2.根据Makefile文件 --执行make	

构建工具-cmake	   


源文件  编译器 目标文件 函数库 可执行文件
 Ninja 是Google的一名程序员推出的注重速度的构建工具,一般在Unix/Linux上的程序通过make/makefile来构建编译,
   而Ninja通过将编译任务并行组织,大大提高了构建速度

模块

 OpenMP是由OpenMP Architecture Review Board牵头提出的,并已被广泛接受,
   用于共享内存并行系统的多处理器程序设计的一套指导性编译处理方案(Compiler Directive)

CMake对 OpenMP 的支持

 CMake 里面有 FindOpenMP 模块,利用这个模块可以方便的开启OpenMP 功能
 
代码: #include <omp.h> 
基础命令
 cmake
 cmake_minimum_required
 project
 set
 message
 add_compile_options
 add_definitions
 add_subdirectory
 add_dependencies
 add_library
 add_executable
 include
 include_directories
 link_directories
 link_libraries
 target_include_directories
 target_link_directories
 target_link_libraries
 find_library
 find_packag

apt安装

sudo apt-get install libpcl-dev
sudo apt install libpcl-dev

源码编译

外部构建(创建build文件夹)方式:
  01. 手动编写 CmakeLists.txt。
  02. 创建build文件夹存放输出文件。
  03. 执行命令 cmake PATH生成 Makefile ( PATH 是顶层CMakeLists.txt 所在的目录 )。
  04. 执行命令make 进行编译。
示例
# 1. 在当前目录下,创建build文件夹 # 2. 进入到build文件夹
mkdir build &&   cd build
# 3. 编译上级目录的CMakeLists.txt,生成Makefile和其他文件
cmake ..
# 4. 执行make命令,生成target
 make

编译包含

find_package(PCLREQUIRED)
include_directories(${PCL_INCLUDE_DIRS})
add_definitions(${PCL_DEFINITIONS})
link_directories(${PCL_LIBRARY_DIRS})


PCL_DIR 是PCL库的安装路径,它是CMake查找PCL库的重要参数、

add_library() 使用该命令可以在Linux下生成(静态/动态)库so或者.a文件,Windows下就是dll与lib文件,它有两种命令格式
   比如linux下的lib< name >.a, Windows下的< name >.lib等
name属性必须全局唯一
  生成的library名会根据STATIC或SHARED成为name.a或name.lib
  这里的STATIC和SHARED可不设置,通过全局的BUILD_SHARED_LIBS的FALSE或TRUE来指定
     库的类型是STATIC(静态库)/SHARED(动态库)/MODULE(模块库)之一
     STATIC库:生成obj文件后,将其链接成静态库,用于链接到其他targets。
     SHARED库:生成obj文件后,将其链接成动态库,用于运行时加载。
     MODULE库:不能链接到其他targets,但是可以用dlopen之类的方法在运行时动态加载。
 通过target_link_library()命令链接

用cmake构建项目时找不到库文件

在CMake中,find_package和find_library都是用于查找依赖库的命令,但它们的作用略有不同。

find_package用于查找安装在系统上的库,
   它会在系统路径和CMAKE_PREFIX_PATH中查找库的头文件和库文件,并将它们添加到CMake的变量中,以便在后续的编译过程中使用。
   同时,它还会检查库的版本和依赖关系,以确保库的正确性。
find_library则是用于查找指定名称的库文件,它会在指定的路径中查找库文件,并将其添加到CMake的变量中。
  它不会检查库的版本和依赖关系,因此需要手动指定库的路径和版本信息。
总的来说,find_package更适用于查找系统安装的库,而find_library更适用于查找自定义的库文件。


 库文件未正确安装或未正确配置路径。
 CMakeLists.txt文件中未正确指定库文件路径。
 编译器未正确配置库文件路径。

  set命令用于将普通、缓存或环境变量(normal, cache, or environment variable)设置为给定值
 CMAKE_MINIMUM_REQUIRED(VERSIN 2.8)  
 PROJECT (HELLO) 
 SET(CMAKE_VERBOSE_MAKEFILE on )
 ADD_SUBDIRECTORY(source_dir [binary_dir] )
 ADD_LIBRARY(libname [SHARED|STATIC|MODULE] [EXCLUDE_FROM_ALL] source1 source2 ... sourceN)
 ADD_DEPENDENCIES()
 ADD_EXECUTABLE(Executable program name ${ Source files })
 
 INCLUDE_DIRECTORIES([AFTER|BEFORE] [SYSTEM] dir1 dir2 ...)
 TARGET_LINK_LIBRARIES(target library1<debug | optimized> library2...)

插值

最近邻插值 (Nearest Neighbour Interpolation)、
线性插值(Linear Interpolation)、
双线性插值 (Bilinear Interpolation)、
双三次插值 (Bicubic interpolation) 等乃至更高阶插值

 lerp  (linear interpolation
 Nlerp (normalized linear interpolation)就是在lerp的基础上进行正则化操作
 Slerp (Spherical linear interpolation)

参考

 CMake 学习笔记(OpenMP) https://blog.csdn.net/liyuanbhu/article/details/131673628		
	https://cmake.org/cmake/help/git-master/manual/cmake-commands.7.html

标签:文件,cmake,C++,编译,add,library,使用,Cmake,find
From: https://www.cnblogs.com/ytwang/p/17784655.html

相关文章

  • 使用三方摄像头,实现pjsip的视频通话功能
    提要:近期一直在做视频通话功能,主要基于pjsip来实现的,将这些过程记录下来,可能对做同类型工作的同学有所帮助!实现思路,参考pjsip原来设备采集视频、编码并rtp组包发送的思路,再在原有流程中做修改!主要关键点:1、摄像头采集完成后已经是已编码的H264/H265的流,不需要再开启pjsip的编......
  • gitee与SourceTree的安装使用
    git可视化管理工具SourceTree安装教程:http://wed.xjx100.cn/news/174839.html?action=onClickgitee可视化管理工具SourceTree安装使用教程:https://blog.csdn.net/wan369282913/article/details/131858067这两篇文章结合着看,第一步下载git,第二步下载sourcetree,第三步用git生成公钥......
  • C++初识(续篇)
    1.2注释作用:在代码中加一些说明和解释,方便自己或其他程序员阅读代码两中格式单行注释:通常放在一行代码的上方,或者一条语句的末尾,对该行代码说明//这样的是单行注释多行注释:通常放在一段代码的上方,对该段代码做整体说明/*这种的是多行注释可以写好多行*/......
  • 土狗夹子机器人使用教程
    币圈量化夹子机器人使用步骤 第1步-在谷歌浏览器中设置MetaMask小狐狸钱包获取MetaMask小狐狸钱包地址:https://metamask.io/第2步-将币安智能链网络添加到MetaMask将BSC智能链添加到小狐狸钱包:第3步-打开Remix部署智能合约网站:https://remix.ethereum.org/......
  • 使用rsa对明文加密与解密
    公钥加密,私钥解密/***加密**@paramplaintext明文*@parampublicKeyStr公钥字符*@return*@throwsException*/publicstaticStringrsaEncrypt(Stringplaintext,StringpublicKeyStr)throwsException{......
  • JavaScript在发送AJAX请求时,URL的域名地址是使用绝对地址还是相对地址?
    在使用JavaScript发送AJAX请求时,URL的域名地址通常是使用相对地址。相对地址指的是相对于当前页面的URL来确定请求的目标地址。当请求发送到服务器时,浏览器会自动将相对地址转换为完整的绝对URL。这样做的好处是能够更灵活地处理不同环境下的URL路径,同时减少了在JavaScript代码中......
  • 在论文写作时是否可以使用第一人称???
    首先说下结论:论文中可以使用第一人称,但是必须在表示个人观点或个人所作工作时才可以使用,在表示客观阐述时是不允许使用第一人才的。可以说在论文中使用第一人称是要看具体情况的,是十分受限的,因此在论文写作中是不提倡使用第一人称的,这一点在中英文论文中都是如此。    ......
  • Qt - QDateTime类的使用
    介绍QDateTime类是Qt框架中用于处理日期和时间的类,在Qt中拥有广泛的应用。它能够精确地表示某个事件或时间点,并且支持对日期和时间进行各种操作和转换,比如计算两个时间之间的差值、设置时区、格式化输出等。使用QDateTime类,我们能够轻松地完成各种日期和时间的转换和处理,从而方......
  • 华为云耀云服务器L实例 - 使用navicat管理数据库
     Navicat是一款功能强大的数据库管理工具,可用于管理多种数据库系统,如MySQL、PostgreSQL、Oracle、SQL Server等。它提供了直观的用户界面和丰富的功能,使得开发者和数据库管理员能够轻松地进行数据库设计、查询、维护和管理。Navicat的一些主要优势包括:1. 多数据库支持:Nav......
  • 小白学算法-数据结构和算法教程: 使用开放寻址线性探测实现自己的哈希表
    Java中使用链接实现哈希表所有数据结构都有其自身的特点,例如,当需要快速搜索元素(在log(n)中)时,会使用BST。当需要在恒定时间内获取最小或最大元素时,使用堆或优先级队列。类似地,哈希表用于在恒定时间内获取、添加和删除元素。在继续实施方面之前,任何人都必须清楚哈希表的工作原理。因此......