共存
Opencv2.4.9安装目录/usr/local
Opencv3.2.0安装目录/usr/local/opencv320
由于本电脑上gcc和g++默认包含(include)路径如下文所示,所以在CMakeLists.txt中,
使用find_package(OpenCV REQUIRED)之后。即使不写include_directories( ${OpenCV_INCLUDE_DIRS} )
编译器也能在/usr/local/include下搜索到Opencv2.4.9头文件,因为/usr/local/include 是编译器默认搜索路径。
若要使用OpenCV3.2.0,则需要在CMakeLists.txt中添上:
#本电脑默认OpenCV_DIR为“Opencv2安装路径/share/OpenCV"
set( OpenCV_DIR "OpenCV3安装路径/share/OpenCV" )
#版本要求可选:find_package(OpenCV 3 REQUIRED)
find_package( OpenCV REQUIRED )
结果使用的便是OpenCV3库。
默认include目录
上面其中有个细节是,opencv2安装在编译器默认include目录,上文专门指定了opencv3(头文件)所在路径,那么编译器在两者中优先选择哪个目录搜索?
如下是本电脑ubuntu14.04上,gcc和g++默认的include目录。
hao@hao-Lenovo-G480:~$ `gcc -print-prog-name=cc1plus` -v
ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../x86_64-linux-gnu/include"
#include "..." search starts here:
#include <...> search starts here:
/home/hao/rgbdslam_catkin_ws/devel/include
/opt/ros/indigo/include
/usr/include/c++/4.8
/usr/include/x86_64-linux-gnu/c++/4.8
/usr/include/c++/4.8/backward
/usr/lib/gcc/x86_64-linux-gnu/4.8/include
/usr/local/include
/usr/lib/gcc/x86_64-linux-gnu/4.8/include-fixed
/usr/include
End of search list.
hao@hao-Lenovo-G480:~$ `g++ -print-prog-name=cc1plus` -v
ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../x86_64-linux-gnu/include"
#include "..." search starts here:
#include <...> search starts here:
/home/hao/rgbdslam_catkin_ws/devel/include
/opt/ros/indigo/include
/usr/include/c++/4.8
/usr/include/x86_64-linux-gnu/c++/4.8
/usr/include/c++/4.8/backward
/usr/lib/gcc/x86_64-linux-gnu/4.8/include
/usr/local/include
/usr/lib/gcc/x86_64-linux-gnu/4.8/include-fixed
/usr/include
End of search list.
----------------------------------------------------------------------------------
http://blog.csdn.net/sun172270102/article/details/50449241
提到了#include语句的语法。由此,在.cpp中使用#include<>时,编译器最先搜索(-l指定目录 gcc)(CMakeLists.txt中include_directories()指定的目录)。
因此,上文的结果是编译器先搜索并使用OpenCV3的头文件路径。
#include用法
#include
语句有两种方式包含头文件,分别是使用双引号" "
与左右尖括号< >
。其区别是(对于不是使用完全文件路径名的)头文件的搜索顺序不同:
使用双引号" "
的头文件的搜索顺序:
-
包含该
#include
语句的源文件所在目录; -
包含该
#include
语句的源文件的已经打开的头文件的逆序; -
编译选项-I所指定的目录
-
环境变量INCLUDE所定义的目录
使用左右尖括号< >
的头文件的搜索顺序:
-
编译选项-I所指定的目录
-
环境变量INCLUDE所定义的目录
include_directories
include_directories命令可以指定当前添加的头文件搜索目录是添加在搜索目录列表最后还是最前面。默认是最后。
include_directories( [AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...] )
By default the directories specified are appended onto the current list of directories. This default behavior can be changed by setting CMAKE_INCLUDE_DIRECTORIES_BEFORE to ON
. By using AFTER
or BEFORE
explicitly, you can select between appending and prepending, independent of the default.