CMakeLists_find_package以及C++基本语法

命令 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
posted @ 2024-03-26 19:13  辰令  阅读(440)  评论(0)    收藏  举报