在cmakelists和makefile中設置opencv

1. 查詢電腦上的opencv版本:
pkg-config --modversion opencv

2. 在電腦上安裝多個版本的opencv,可以通過指定安裝路徑進行設置:
     下載源碼後進入文件夾,打開終端;

mkdir build
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local/opencv3.4
#CMAKE_BUILD_TYPE 確定了編譯類型,是release還是debug,一般release比較常用, ubuntu下就是.so庫,但是window下會有dll和lib之分;
#CMAKE_INSTALL_PREFIX  安裝路徑前綴, 確定了這個路徑後,make install的opencv 的includepath 和lib等都會安裝在這個文件夾下;
make -j4
sudo make install  

接下來opencv就安裝到/usr/local/opencv3.4下的文件夾中,可以按照這個路徑查看你的opencv是否安裝成功;

同理,也可以使用這種方法安裝其他版本的opencv,只要將安裝路徑的prefix修改即可

3. 使用不同版本的opencv

如果想要在你的project中調用opencv庫,個人覺得比較方便的還是CMakeLists文件,也有可能是因爲用的比較多

如果只有一個版本的opencv,我們一般直接使用:

FIND_PACKAGE(OpenCV REQUIRED)

這種情況適用於只有一個版本的opencv,安裝在默認路徑下,一般是/usr/local/lib下,比如我的opencv2.4.13, 因爲安裝的時候如果不指定prefix路徑,那麼在make install 時會將所有的 .so 文件安裝在 /usr/local/lib 下,所有的頭文件安裝在/usr/include下

 但是這裏我們對opencv3.4的安裝指定了路徑,所以,如果想要使用opencv3.4,則需要在find_package之前設定cmake的查找路徑:

set(CMAKE_PREFIX_PATH "/usr/local/opencv3.4")

也就是讓cmake去這裏找opencv;

這裏需要贅述的是,find_package 其實尋找的是OpenCVConfig.cmake文件,打開這個文件就能看到當前opencv所對應的版本,同時也對一些路徑進行了定義,類似於c++中的宏的感覺,尤其是:OpenCV_LIBS  OpenCV_INCLUDE_DIRS 兩個路徑,這就保證了cmake可以正常找到opencv所需要的頭文件和庫文件;

因此也就有了第三種包含opencv的方法,就是直接設定這兩個路徑:

set(OpenCV_DIR "/usr/local/opencv3.4/share/OpenCV")
find_package(OpenCV 3.4 REQUIRED COMPONENTS core highgui imgproc flann calib3d)  
include_directories(${OpenCV_INCLUDE_DIRS})
target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS})

然後將${OpenCV_INCLUDE_DIRS} 和 ${OpenCV_LIBS} 分別添加到 include_directories 和 target_link_libraries中即可;

白巧克力的在cmakelists中設定opencv: https://blog.csdn.net/heyijia0327/article/details/54575245

另外還有一種方法即設定makefile, 其實cmakelist的目的也是爲了生成makefile, 然後進行編譯,因此,我們也可以跳過cmakelist,直接寫makefile文件,這裏說一下如何在makefile中包含指定路徑的opencv:

這裏的設定也有兩種方法,第一種是指定INCLUDE 和lib 的路徑後進行鏈接,如下:

#這裏需要根據自己在linux上配置的opencv路徑修改

INCLUDES = -I/usr/local/opencv3.4/include/opencv  #INCLUDES 指定了頭文件的路徑
LIBS = -lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_ml # LIBS 指定了需要哪些庫
LIBDIRS = -L/usr/local/opencv3.4//lib #LIBDIRS 指定了需要的庫的路徑
OPT = -O3 -Wno-deprecated
CC=g++     # 使用g++進行編譯
.PHONY: all clean  #說明 all 和clean 兩個目標文件都是僞目標文件 主要是爲了節省命令,每次自動指定test2目標的生成
OBJS= test2.o
clean:   # 僞目標cleam, 這兩句話主要是爲了清除掉所有的依賴庫 .o 文件,以及 可執行文件 test2
    rm -f *.o *~ test2
all:test2  
    echo all:make complete

%.o:%.cpp    # 這兩句話表示 庫test.o 是依賴於 文件test.cpp 的
    $(CC) -c $(INCLUDES) $+ $(OPT)  #要生成.o 庫,需要利用g++ 進行編譯,同時包含 INCLUDES 這個變量所指定的頭文件,OPT指定的一些生成庫時的優化選項


test2:$(OBJS)  # 這時已經生成了一個 test.o的 依賴庫, 接下來需要生成一個叫做test2的可執行文件
    $(CC) $(LIBDIRS) $(LIBS) -o $@ $+ $(OPT)   # 同理,也需要用g++進行編譯,然後需要鏈接到test.o的庫, $@ 其實表示所有的目標集,也就是.o文件,本例中只有test.o 

makefile的文件來源於博客 https://blog.csdn.net/pbypby1987/article/details/18969441, 博客給了例子,沒有詳細的講解,這裏贅述一下;

更詳細的makefile的語法可以參考陳浩博士的 跟我一起學makefile系列,很詳細也很清晰;

上面的例子是自己的新建,比較簡短,只包含了opencv,且目標文件也比較少,當目標文件比較多 或這需要的庫也比較多時,可以利用pkg-config來進行設置;

首先來說一下具體的設置步驟,然後再來說一下這其中的包含關係以及爲什麼要這麼設定:

還是以自定義安裝路徑爲例,如果非自定義,一般會安裝在/usr/local/lib下,將對應的路徑修改就好;

這裏假裝回到剛剛執行完make install 命令,接下來就是配置環境變量,讓opencv3.4可以被找到:
 

sudo gedit /etc/ld.so.conf.d/opencv.conf 

執行此命令後,有可能打開的是一個空白文件,也有可能文件中已經有/usr/local/lib, 只需要接着寫入:

/usr/local/opencv3.4/lib 

即可;

生效配置文件:

執行如下的命令才能讓剛纔的配置路徑生效:

sudo ldconfig

配置 bash

sudo gedit /etc/bash.bashrc

在末尾追加:

PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/opencv3.4/lib/pkgconfig

保存, 執行如下命令使得配置生效:

source /etc/bahs.bashrc

更新:

sudo updatedb

其實執行完sudo ldconfig之後,就可以在對應的路徑,也就是/usr/local/opencv3.4/lib 中找到一個對應的pkgconfig文件,如下:

 進入到pkgconfig路徑下後可以看到文件opencv.pc,具體內容如下:

# Package Information for pkg-config
​​​​​​​prefix=/usr/local/opencv3.4
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir_old=${prefix}/include/opencv
includedir_new=${prefix}/include

Name: OpenCV
Description: Open Source Computer Vision Library
Version: 3.4.0

Libs: -L${exec_prefix}/lib -lopencv_dnn -lopencv_ml -lopencv_objdetect -lopencv_shape -lopencv_stitching -lopencv_superres -lopencv_videostab -lopencv_calib3d -lopencv_features2d -lopencv_highgui

    -lopencv_videoio -lopencv_imgcodecs -lopencv_video -lopencv_photo -lopencv_imgproc -lopencv_flann -lopencv_viz -lopencv_core
Libs.private: -ldl -lm -lpthread -lrt
Cflags: -I${includedir_old} -I${includedir_new}  

從上面的文件也可以看出 .pc 文件其實就是包含了當前opencv版本的信息以及文件信息,其實其opencvconfig.cmake文件屬性類似;這裏需要設置的就是這個pc文件的路徑,可以讓pkgconfig可以找到;

這裏舉一個複雜的makefile的例子(對我比較複雜),部分makefile如下:

CC=g++   #設定編譯器類型
CFLAGS = -I ../common/inc -std=c++1y -g0 -O3 -I/usr/local/opencv3.4/include  #編譯選項
$(shell mkdir -p $(OUT_DIR))
main: $(OUTPUT_SOC) $(OUTPUT_C) $(OUTPUT_MAP) $(OUTPUT_PACKET) $(OUTPUT_RX_DATA_PARSER) $(OUTPUT_DEBUG) $(OUTPUT_PROTOCOL) $(OUTPUT_DETECTIONDATA) $(OUTPUT_DOORFRAME) $(OUTPUT_LINESEGMENT)

@$(CC) -pthread -o $@ $(CFLAGS) $(OUTPUT_SOC) $(OUTPUT_C) $(OUTPUT_MAP) $(OUTPUT_PACKET) $(OUTPUT_RX_DATA_PARSER) $(OUTPUT_DEBUG) $(OUTPUT_PROTOCOL) $(OUTPUT_DETECTIONDATA) $(OUTPUT_DOORFRAME) $

     (OUTPUT_LINESEGMENT) `pkg-config --libs --cflags opencv`   #按照pkg的配置進行庫的查找

$(OUTPUT_SOC): src/socket.cpp    #生成目標依賴庫

    $(info Compiling $(<))

    @$(CC) $(CFLAGS) -c $< -o $@  

 

`pkg-config --libs --cflags opencv`  

 這句話設定了利用pkg-config進行opencv的庫的查找

爲了確定opencv是否在config的路徑中,可以用

export PKG_CONFIG_PATH 或者echo ${PKG_CONFIG_PATH} 

進行檢驗;

.pc 文件參考:https://blog.csdn.net/absurd/article/details/599813

陳浩博士:https://blog.csdn.net/haoel/article/details/2887 

環境配置參考:https://www.jianshu.com/p/f646448da265 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章