共存
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.