grep -r "OpenCV REQUIRED" *
find ./ -name "CMakeLists.txt"
find ./ -iname "CMakeLists.txt" | xargs sed -i "s/OpenCV REQUIRED/OpenCV 3 REQUIRED/g"
Linux之sed命令详解
sed
中的-i
选项意思是对文件直接进行编辑;" "
里面的s/...../g
命令意思是替换文件中每一行的所有匹配文本为新的文本,比如 sed -i 's/book/books/g' file
会匹配file文件中每一行的所有book替换为books。
xargs命令 – 过滤器
简单的来说这个命令就是把前面的命令穿过来的值作为下一个命令的参数,传入给下一个命令。按照上面替换OpenCV版本的操作,就是寻找到所有的CMakeLists.txt
文件,然后把这些文件传给sed
命令,从而实现这些文件中OpenCV内容的替换。
find命令 – 查找和搜索文件
find命令就是查找和搜索文件的,其中-name
参数是按照文件名进行搜索,如果前面加了-i
前缀变成-iname
则代表搜索文件名不区分大小写。
在调用cmake
命令进行编译的时候,可以一并传入相关的参数。
比如在CMakeLists.txt
文件中,为了让cmake
到特定的位置去找OpenCV
,一般会写成下面这样:
set(OpenCV_DIR "/usr/local/opencv-3.4.5/share/OpenCV")
find_package(OpenCV REQUIRED)
# 或者有的程序会制定OpenCV版本 find_package(OpenCV 3 REQUIRED)
上面的语句就是指定cmake
到我设置的目录下寻找OpenCV
,如下图所示。注意这个路径一定要设置到OpenCVConfig.cmake
所在的目录,因为这是find_package
命令寻找的文件,对应find_package
的Config
模式。关于find_package
的查找模式,可以参考:Cmake之深入理解find_package()的用法。
而set
命令就相当于给变量设置值,设置了OpenCV
这个包的查找路径OpenCV_DIR
的值使我们想要的路径。
与set
命令同样的效果,可以在命令行调用cmake
命令的时候一并传入参数,写成如下命令(注意-D后面没有空格):
# 1. shell命令行输入
cmake -DOpenCV_DIR=/usr/local/opencv-3.4.5/share/OpenCV
# 2.等价于CMakeLists.txt中的 :
set(OpenCV_DIR "/usr/local/opencv-3.4.5/share/OpenCV")
ROS使用的是catkin_make
而不是cmake
,但是注意catkin_make
底层还是cmake
。只不过由于ROS工程很庞大,为了方便编译管理对cmake
和make
进行了封装变成了catkin_make
。catkin_make
仍然提供了跟cmake
和make
对接的参数:
--cmake-args [CMAKE_ARGS [CMAKE_ARGS ...]]
传给CMake的参数
--make-args [MAKE_ARGS [MAKE_ARGS ...]]
传给Make的参数
因此对于ROS工程,上面的设置OpenCV查找路径可以在调用catkin_make
的时候写成:
catkin_make --cmake-args -DOpenCV_DIR=/usr/local/opencv-3.4.5/share/OpenCV
但是,实际上直接把catkin_make
当成cmake
命令来用也是可以的,因此上面的命令也可以写成:
catkin_make -DOpenCV_DIR=/usr/local/opencv-3.4.5/share/OpenCV
另外想catkin_make -j8
等命令都可以使用。因此在调用catkin_make
编译的时候传参和cmake
的使用差不多。