命令 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