C++_Cmake的使用

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
posted @ 2023-10-24 13:58  辰令  阅读(51)  评论(0编辑  收藏  举报