首页 > 编程语言 >CMakeLists_find_package以及C++基本语法

CMakeLists_find_package以及C++基本语法

时间:2024-03-26 19:22:54浏览次数:24  
标签:文件 CMakeLists cmake package C++ PATH find 指针

命令 catkin_make

等效于以下指令:
cd ~/catkin_ws
cd src
catkin_init_workspace
cd ..
mkdir build
cd build
cmake ../src  -DCMAKE_INSTALL_PREFIX=../install -DCATKIN_DEVEL_PREFIX=../devel

命令 cmake 与 make install

    -DCMAKE_BUILD_TYPE=:  release debug
    -DCMAKE_INSTALL_PREFIX=/usr/local/mysql       \    #安装路径
	
     # 下面形式是相同的
     cmake -DTEST_DEBUG=ON ..
     cmake -D TEST_DEBUG=ON ..
     CMAKE_INSTALL_PREFIX,用于指定cmake install时的相对地址前缀
     CMAKE_INSTALL_PREFIX,用于指定cmake install时的相对地址前缀
       通过修改 CMAKE_INSTALL_PREFIX 变量的值来指定这些文件应该拷贝到哪个根目录
    make install 和make install prefix=/usr/local/
     prefix默认是/usr/local 
1) 如果共享库文件安装到了/lib或/usr/lib目录下, 那么需执行一下ldconfig命令
  ldconfig命令的用途, 主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下, 搜索出可共享的动态链接库(格式如lib*.so*), 进而创建出动态装入程序(ld.so)所需的连接和缓存文件. 缓存文件默认为/etc/ld.so.cache, 此文件保存已排好序的动态链接库名字列表. 

2) 如果共享库文件安装到了/usr/local/lib(很多开源的共享库都会安装到该目录下)或其它"非/lib或/usr/lib"目录下, 那么在执行ldconfig命令前, 还要把新共享库目录加入到共享库配置文件/etc/ld.so.conf中, 如下:
# cat /etc/ld.so.conf
include ld.so.conf.d/*.conf
# echo "/usr/local/lib" >> /etc/ld.so.conf
# ldconfig

) 如果共享库文件安装到了其它"非/lib或/usr/lib" 目录下,  但是又不想在/etc/ld.so.conf中加路径(或者是没有权限加路径). 那可以export一个全局变量LD_LIBRARY_PATH, 然后运行程序的时候就会去这个目录中找共享库

文件中CMakeLists.txt:

find_package 需要找到指定本版的库头文件包含路径、链接库路径等,从而能够满足我们开发项目的编译链接需要。
find_package命令便捷进行依赖包配置的前提是这个包的开发者也是用CMake配置好了这个包,
    并提供了<PackageName>Config.cmake或Find<PackageName>.cmake的配置文件
 本质是通过一些特定的规则找到<package_name>Config.cmake包配置文件,
    通过执行该配置文件,从而定义了一系列的变量,通过这些变量就可以准确定位到库的头文件和库文件,完成编译
 CMake提供了find_package()命令用来查找
 CMake本身不提供任何搜索库的便捷方法,所有搜索库并给变量复制的操作必须由CMake代码完成,
  也就是目录下的<PackageName>Config.cmake或Find<PackageName>.cmake的配置文件。
   只不过库的作者通常会提供这两个文件,以方便使用者调用。
REQUIRED:可选字段。表示一定要找到包,找不到的话就立即停掉整个CMake。而如果不指定REQUIRED则CMake会继续执行。

默认查询路径

 find_package查找.cmake的默认查询路径有如下
 PATH
 CMAKE_PREFIX_PATH
 CMAKE_FRAMEWORK_PATH
 CMAKE_APPBUNDLE_PATH
 echo $PATH可查询PATH包含哪些默认查询路径,以默认路径为根目录,find_package将查询目录下包含的.cmake文件

设置查询路径

让find_package在指定路径找依赖包,有三种方式
# 1. 设置DIR
set(Torch_DIR /home/libtorch)
find_package(Torch REQUIRED)   
# 2. 设置PATHS
find_package(Protobuf REQUIRED
			 PATHS /home/libtorch
			 NO_DEFAULT_PATH)    
# 3. 指定
set(CMAKE_PREFIX_PATH /home/libtorch)

改变

 find_package(YourPackageName NO_DEFAULT_PATH)    ## 不要在默认的路径中查找
 find_package(YourPackageName NO_CMAKE_PATH)	  ## 不要在CMAKE_PREFIX_PATH变量中指定的路径中查找  

C++ 语法

重载
  operator 是C++的一个关键字,它和运算符(如=)一起使用,表示一个运算符重载函数
  使用operator重载运算符,是C++扩展运算符功能的方法
     将操作符重载实现为类的成员函数;操作符重载实现为非类的成员函数(即全局函数
   1.类体中声明(定义)需要重载的操作符
  
   2.operator()函数对象
     仿函数(functor)又称为函数对象(function object)是一个能行使函数功能的类。
	  仿函数的语法几乎和我们普通的函数调用一样,不过作为仿函数的类,都必须重载operator()运算符,
	  
	在C++中,如果你想要定义一个结构体E并使其具有类似于Hasher的功能,
	   要确保E有一个名为operator()的重载方法, 这个方法允许你像调用函数一样调用你的结构体实例  
数据容器
vector其中一个特点:内存空间只会增长,不会减小,
  援引C++ Primer:为了支持快速的随机访问,vector容器的元素以连续方式存放,每一个元素都紧挨着前一个元素存储

  hash_map ,unordered_map ,map 
   头文件#include <unordered_map>,命名空间需要引入using std::unordered_map,我
    unordered_map 容器,直译过来就是"无序 map 容器"的意思
     emplace 的使用和insert的使用方法类似,但是emplace无需使用value类型参数,而是直接将参数列表传递给元素类型的构造函数。
 class unordered_map
{
  typedef __umap_hashtable<_Key, _Tp, _Hash, _Pred, _Alloc>  _Hashtable;
  _Hashtable _M_h;

 }	
_Hashtable具体是什么:
  template<bool _Cache>
    using __umap_traits = __detail::_Hashtable_traits<_Cache, false, true>;
   template<typename _Key,
       typename _Tp,
       typename _Hash = hash<_Key>,
       typename _Pred = std::equal_to<_Key>,
       typename _Alloc = std::allocator<std::pair<const _Key, _Tp> >,
       typename _Tr = __umap_traits<__cache_default<_Key, _Hash>::value>>
  
 enum  枚举(enumeration)和类相似,能够定义一种新的数据类型,不同的是,枚举是将一组整形常量组织在一起
 struct 结构体
模板
  模板就是实现代码重用机制的一种工具,它可以实现类型参数化,即把类型定义为参数,从而实现了真正的代码可重用性	
    关键字using作为别名声明的开始,其后紧跟别名和等号,其作用是把等号左侧的名字规定成等号右侧类型的别名
    template<typename T>
    using MMap = map<int, T>;  
   	  
  等价于
   template<typename T>
   struct MyMap
    {
   	 typedef map<int, T> mapType;
    };
 	
`eof` 是End Of File的缩写,表示文件结束 
   :this是指向自身对象的指针,*this是自身对象	
    c++中,return this 是返回当前对象的地址,
	      return *this 是返回当前对象或当前对象的拷贝。如果返回的是引用,那么就是对象本身,否则是对象的拷贝
	1e3  :1乘以10的三次方。e为阶码标志,大小写通用,3为阶码 
    1e-3 :0.001 		
 std::ostream::seekp
    ifstream 类和 fstream 类有 seekg 成员函数,可以设置文件读指针的位置; ostream & seekp (int offset, int mode);
    ofstream 类和 fstream 类有 seekp 成员函数,可以设置文件写指针的位置。 istream & seekg (int offset, int mode);
	    ios::beg:让文件读指针(或写指针)指向从文件开始向后的 offset 字节处。
		         offset 等于 0 即代表文件开头。在此情况下,offset 只能是非负数。
        ios::cur:在此情况下,offset 为负数则表示将读指针(或写指针)从当前位置朝文件开头方向移动 offset 字节,
		         为正数则表示将读指针(或写指针)从当前位置朝文件尾部移动 offset字节,为 0 则不移动。
        ios::end:让文件读指针(或写指针)指向从文件结尾往前的 |offset|(offset 的绝对值)字节处
    
    所谓“位置”,就是指距离文件开头有多少个字节。文件开头的位置是 0
  seekg():输入 文件指针跳转函数。表示将输入文件指针跳转到指定字节位置‘  "g" 表示 "get",
    本质在于文件中有一个指针,在指针位置进行读写操 正的表示向后偏移,负的表示向前偏移
    01.  seekg(0L,ios::beg); 表示从文件的开头位置开始,移动 0 字节,实际上就是指移动到文件开头
	    如果目前已经在文件末尾,则在调用此函数之前,必须清除文件末尾的标志
		 dataIn.clear(); dataIn.seekg(0L, ios::beg);
   
  seekp():输出 文件指针跳转函数。表示将输出文件指针跳转到指定位置 p是put缩写
文件操作和文件流  #include <fstream> 
 std::ofstream和std::ifstream都属于fstream这个类。
 fstream是控制文件读写操作的一个类,其中包括std::ofstream和std::ifstream  

java

    hashCode()方法的作用是确定对象在散列存储结构例如HashMap、HashSet中的逻辑地址
      hashCode并不需要唯一性,但equals必须严格地判断两个对象是否相同-保证单一原则:equals相同的两个对象的hashcode必须相同	 
    在无序集合中(如Set),使用hashcode来计算key应存储在hash表的索引,
     如果重写了equals而没有重写hashcode,会出现两个完全相同的对象。
     因为hashcode不同,计算出的索引不同		  

参考

 https://www.zhihu.com/question/21866381/answer/2309063290
 C++11特性:使用using和typedef给模板定义别名  https://blog.csdn.net/qq_73185160/article/details/135049613
 C++ seekg()和seekp()用法详解  https://c.biancheng.net/view/pbwx9nt.html	 
  https://blog.csdn.net/baidu_35692628/article/details/132724130
 “轻松搞定CMake”系列之find_package用法详解 https://blog.csdn.net/zhanghm1995/article/details/105466372

标签:文件,CMakeLists,cmake,package,C++,PATH,find,指针
From: https://www.cnblogs.com/ytwang/p/18097374

相关文章

  • 一个C/C++出身的程序员,如果想成为一个黑客,需要多久时间?
    黑客,在没有学习编程的人眼中,是无所不能的存在,盗密码,黑网站,网络入侵,偷取数据等,一台电脑,全部搞定!而且很多同学的话开始学习编程的原因就是被黑客的这个技术所吸引的。说起来,好像笔者当年也觉得黑客很厉害,所以的话多多少少我成为C/C++工程师也是有以前的因素的影响,不过后来接触......
  • ccf-csp-2020-12-2期末预测之最佳阈值(c++满分题解)
    这个题暴力是可以有70分的,下面是暴力代码:(注释写的比较清楚了,也很好理解)#include<iostream>#include<vector>#include<set>#include<algorithm>usingnamespacestd;boolsort1(pair<int,int>vec1,pair<int,int>vec2)//对阈值从小到大排序{ returnvec1.first<=ve......
  • CUTLASS: Fast Linear Algebra in CUDA C++
    https://developer.nvidia.com/blog/cutlass-linear-algebra-cuda/EfficientMatrixMultiplicationonGPUs计算密集度=(时间复杂度/空间复杂度)=O(N^3)/O(N^2)=O(N)//naivefor(inti=0;i<M;++i)for(intj=0;j<N;++j)for(intk=0;k<......
  • c++栈内存溢出问题
    问题说明实验课测量快排时间时,用intar[MAXSIZE+1];来创建数组,数据规模从1000-10000,而MAXSIZE的设置不能超过600000,超过了程序就无法运行直接中断,理论上这是不应该。程序中用rand()生成随机数据,但若对数据求模rand()%100,则程序运行到中途会异常中断。问题原因intar[M......
  • 【C++】常用序列式容器迭代器自增效率实测
    常用序列式容器包括vector、list、deque。本篇文章就来评析它们的迭代器,不同自增方式效率的不同。在看这篇文章之前,大家可以先看看这篇文章:【C++】自增运算符重载及其效率问题-CSDN博客,了解一下之前得出的结果。前面的文章其中一个结论是,在自定义类型的自增(自减)运算符重载......
  • C++面向对象整理(9)之类型转换 dynamic_cast、static_cast、const_cast及其安全性
    C++面向对象整理(9)之C++的类型转换dynamic_cast、static_cast、const_cast注:整理一些突然学到的C++知识,随时mark一下例如:忘记的关键字用法,新关键字,新数据结构C++的类型转换C++面向对象整理(9)之C++的类型转换dynamic_cast、static_cast、const_cast一、C++的类型转换......
  • 函数是什么?C++函数详解!
    1、函数的声明和定义在复杂的程序中,如果全部的代码都写在main函数中,main函数体将非常庞大臃肿。把任务分工到其它的函数中,main函数只负责程序的核心流程,具体的任务由其它函数完成。这种思想就是模块化编程。声明和定义函数的语法:返回值的数据类型函数名(参数一的数据类型......
  • std::packaged_task
    std::packaged_task包装一个可调用的对象,并且允许异步获取该可调用对象产生的结果,从包装可调用对象意义上来讲,std::packaged_task与std::function类似,只不过std::packaged_task将其包装的可调用对象的执行结果传递给一个std::future对象(该对象通常在另外一个线程中获取st......
  • C++ 23 新特性概览之 标准库
    文章目录C++23新特性概览之标准库简介关于环境字符串格式化改进标准库模块`importstd``importstd.compat``basic_string(_view)::contains()`禁止从`nullptr`构造`string(_view)``basic_string::resize_and_overwrite(count,op)``std::optional`的链式调用`S......
  • C++11标准模板(STL) 算法(std::reverse)
    定义于头文件<algorithm>算法库提供大量用途的函数(例如查找、排序、计数、操作),它们在元素范围上操作。注意范围定义为 [first,last) ,其中 last 指代要查询或修改的最后元素的后一个元素。逆转范围中的元素顺序std::reverse1)反转[first,last)范围中的元素顺序表......