親測成功???Linux下編譯opencv-4.10.0(靜態鏈接庫和動態鏈接庫)

1. 安裝依賴

在編譯之前,確保系統中安裝了必要的依賴工具和庫。運行以下命令安裝:

sudo apt update
sudo apt-get install build-essential
sudo apt-get install cmake git libgtk2.0-dev pkg-config
sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev
sudo apt-get install python-dev python-numpy libtbb2
sudo apt-get install libtbb-dev libjpeg-dev libpng-dev libtiff-dev
sudo apt-get install libdc1394-22-dev
sudo apt-get install libjasper-dev
sudo apt-get install libavcodec-dev libavformat-dev
sudo apt-get install libswscale-dev libv4l-dev liblapacke-dev
sudo apt-get install libxvidcore-dev libx264-dev
sudo apt-get install libatlas-base-dev gfortran
sudo apt-get install ffmpeg

這些工具包括:

  • build-essential: 提供 GCC 編譯器和其他開發工具。
  • cmake: 用于生成 Makefile。
  • 各種圖像處理、視頻編碼解碼相關的庫。
  • Python 支持(如果需要)。

注:如果安裝 libjasper-dev 包的時候報錯,如下:

E: Unable to locate package libjasper-dev

則需要按以下步驟進行 libjasper-dev 包的安裝?

依次運行如下指令:

sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main"
sudo apt update
sudo apt install libjasper1 libjasper-dev


2. 下載 OpenCV 源碼

如果還沒有下載源碼,可以通過以下命令獲取:

wget https://github.com/opencv/opencv/archive/refs/tags/4.10.0.zip
unzip 4.10.0.zip

如果你還需要額外的模塊(例如 opencv_contrib),可以同時下載 opencv_contrib 模塊:

wget https://github.com/opencv/opencv_contrib/archive/refs/tags/4.10.0.zip
unzip 4.10.0.zip
mv opencv_contrib-4.10.0 opencv_contrib
mv opencv_contrib ./opencv-4.10.0/

3. 配置 CMake 參數同時生成動態和靜態庫

使用 cmake 配置編譯選項。以下是一個基本的配置命令,此處僅做參數說明不是實際配置命令:

cmake -D CMAKE_BUILD_TYPE=Release \-D CMAKE_INSTALL_PREFIX=/usr/local \-D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules \-D ENABLE_PRECOMPILED_HEADERS=OFF \-D BUILD_EXAMPLES=ON \..

參數說明:

  • CMAKE_BUILD_TYPE=Release: 設置為 Release 模式以優化性能。
  • CMAKE_INSTALL_PREFIX=/usr/local: 指定安裝路徑。
  • OPENCV_EXTRA_MODULES_PATH: 如果使用了?opencv_contrib?模塊,指定其路徑。
  • ENABLE_PRECOMPILED_HEADERS=OFF: 在某些系統上可能會遇到預編譯頭文件問題,關閉此選項。
  • BUILD_EXAMPLES=ON: 編譯示例代碼(可選)。

如果需要支持 Python,可以添加以下參數:

-D PYTHON3_EXECUTABLE=$(which python3) \
-D PYTHON3_PACKAGES_PATH=$(python3 -m site --user-site)

為了同時生成動態和靜態庫,可以在不同的構建目錄中分別配置和編譯。

在運行 cmake 命令時,添加以下兩個關鍵參數:

BUILD_SHARED_LIBS=ON  #啟用動態鏈接庫的構建。
BUILD_SHARED_LIBS=OFF  #啟用靜態鏈接庫的構建。

(1) 創建兩個獨立的構建目錄

為了避免沖突,分別為動態庫和靜態庫創建兩個獨立的構建目錄。

mkdir build_shared
mkdir build_static

(2) 退出anaconda環境(如果沒有配置anaconda環境可跳過此步)

如果已經在linux下配置了anaconda環境,需要先退出環境并指定優先使用系統庫而不是 Anaconda 的庫???

這一點非常重要,這也是很多小伙伴在利用CMake配置構建系統,生成Makefile 文件時發現只是一些警告,并沒有報錯就忽視了,但是緊接著使用 make 命令編譯源代碼的時候就會發現在編譯過程中就會報錯,一頭霧水。

相關警告如下:

--
-- Configuring done
CMake Warning at cmake/OpenCVUtils.cmake:1582 (add_library):Cannot generate a safe runtime search path for target opencv_imgcodecsbecause files in some directories may conflict with libraries in implicitdirectories:runtime library [libpng16.so.16] in /usr/lib/x86_64-linux-gnu may be hidden by files in:/home/anaconda3/libruntime library [libz.so.1] in /usr/lib/x86_64-linux-gnu may be hidden by files in:/home/anaconda3/libruntime library [libtiff.so.5] in /usr/lib/x86_64-linux-gnu may be hidden by files in:/home/anaconda3/libSome of these libraries may not be found correctly.
Call Stack (most recent call first):cmake/OpenCVModule.cmake:989 (ocv_add_library)cmake/OpenCVModule.cmake:905 (_ocv_create_module)modules/imgcodecs/CMakeLists.txt:168 (ocv_create_module)CMake Warning at cmake/OpenCVUtils.cmake:1568 (add_executable):Cannot generate a safe runtime search path for target opencv_test_highguibecause files in some directories may conflict with libraries in implicitdirectories:runtime library [libgio-2.0.so.0] in /usr/lib/x86_64-linux-gnu may be hidden by files in:/home/anaconda3/libruntime library [libgobject-2.0.so.0] in /usr/lib/x86_64-linux-gnu may be hidden by files in:/home/anaconda3/libruntime library [libgthread-2.0.so.0] in /usr/lib/x86_64-linux-gnu may be hidden by files in:/home/anaconda3/libruntime library [libglib-2.0.so.0] in /usr/lib/x86_64-linux-gnu may be hidden by files in:/home/anaconda3/libSome of these libraries may not be found correctly.
Call Stack (most recent call first):cmake/OpenCVModule.cmake:1327 (ocv_add_executable)modules/highgui/CMakeLists.txt:309 (ocv_add_accuracy_tests)CMake Warning at cmake/OpenCVUtils.cmake:1582 (add_library):Cannot generate a safe runtime search path for target opencv_highguibecause files in some directories may conflict with libraries in implicitdirectories:runtime library [libgio-2.0.so.0] in /usr/lib/x86_64-linux-gnu may be hidden by files in:/home/anaconda3/libruntime library [libgobject-2.0.so.0] in /usr/lib/x86_64-linux-gnu may be hidden by files in:/home/anaconda3/libruntime library [libgthread-2.0.so.0] in /usr/lib/x86_64-linux-gnu may be hidden by files in:/home/anaconda3/libruntime library [libglib-2.0.so.0] in /usr/lib/x86_64-linux-gnu may be hidden by files in:/home/anaconda3/libSome of these libraries may not be found correctly.
Call Stack (most recent call first):cmake/OpenCVModule.cmake:989 (ocv_add_library)cmake/OpenCVModule.cmake:905 (_ocv_create_module)modules/highgui/CMakeLists.txt:291 (ocv_create_module)-- Generating done
-- Build files have been written to: /home/opencv-4.10.0/build_shared

沒有警告應該是這樣的:

--
-- Configuring done
-- Generating done
-- Build files have been written to: /home/opencv-4.10.0/build_shared

為了避免出現Anaconda環境干擾,導致在編譯的時候系統庫被覆蓋或隱藏,出現錯誤,因此做如下處理:

?①?禁用 Anaconda 環境

conda deactivate

② 設置?LD_LIBRARY_PATH

臨時修改 LD_LIBRARY_PATH,優先使用系統庫而不是 Anaconda 的庫:

export LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH

③ 配置?CMAKE_PREFIX_PATH(可選)

在運行 CMake 時,增加顯式指定庫路徑,搭配接下來操作中的CMake語句使用:

cmake -DCMAKE_PREFIX_PATH=/usr/lib/x86_64-linux-gnu ..

(3) 配置動態鏈接庫

進入 build_shared 目錄并運行 CMake,啟用動態庫構建:

cd build_shared
cmake -D CMAKE_BUILD_TYPE=Release \-D CMAKE_INSTALL_PREFIX=/home/opencv-4.10.0/build_shared \  #修改成自己想保存的下載位置-D BUILD_SHARED_LIBS=ON \-D OPENCV_EXTRA_MODULES_PATH=/home/opencv-4.10.0/opencv_contrib/modules \   #修改成自己opencv_contrib所在的位置..

(4) 配置靜態鏈接庫

進入 build_static 目錄并運行 CMake,啟用靜態庫構建:

cd build_static
cmake -D CMAKE_BUILD_TYPE=Release \-D CMAKE_INSTALL_PREFIX=/home/opencv-4.10.0/opencv_static \   #修改成自己想保存的下載位置-D BUILD_SHARED_LIBS=OFF \-D OPENCV_EXTRA_MODULES_PATH=/home/opencv-4.10.0/opencv_contrib/modules \     #修改成自己opencv_contrib所在的位置..

注意:

  • 使用不同的安裝路徑(如?/usr/local/opencv_shared?和?/usr/local/opencv_static),以避免沖突。
  • 如果不需要?opencv_contrib?模塊,可以省略?-D OPENCV_EXTRA_MODULES_PATH?參數。

4. 編譯和安裝

分別在兩個構建目錄中執行編譯和安裝命令。

(1) 編譯和安裝動態庫

build_shared 目錄中:

make -j$(nproc)
sudo make install

(2) 編譯和安裝靜態庫

build_static 目錄中:

make -j$(nproc)
sudo make install

5. 驗證安裝

安裝完成后,可以分別驗證動態庫和靜態庫是否正確生成。

(1) 動態庫驗證

檢查動態庫文件是否存在于安裝路徑下,例如:

ls /usr/local/opencv_shared/lib

你應該會看到類似 libopencv_core.so 的動態庫文件。

(2) 靜態庫驗證

檢查靜態庫文件是否存在于安裝路徑下,例如:

ls /usr/local/opencv_static/lib

你應該會看到類似 libopencv_core.a 的靜態庫文件。


6. 使用動態庫或靜態庫

在項目中使用 OpenCV 時,需要根據需求選擇動態庫或靜態庫。

(1) 使用動態庫

確保動態庫路徑已添加到系統的動態鏈接器緩存中:

sudo ldconfig

然后在編譯項目時鏈接動態庫即可。

(2) 使用靜態庫

在編譯項目時,顯式指定靜態庫路徑和文件。例如:

g++ my_program.cpp -I/usr/local/opencv_static/include/opencv4 \-L/usr/local/opencv_static/lib \-lopencv_core -lopencv_imgproc -lopencv_highgui -static

注意:

  • 使用?-static?參數強制鏈接靜態庫。
  • 確保鏈接所有必要的靜態庫模塊。

7. 清理(可選)

如果不再需要編譯過程中的臨時文件,可以清理它們:

make clean

注意事項

  1. 多版本沖突:如果系統中已有其他版本的 OpenCV,可能會導致沖突。建議通過?CMAKE_INSTALL_PREFIX?指定獨立的安裝路徑,保證動態庫和靜態庫安裝在不同的路徑,避免沖突。
  2. Python 支持:確保你的 Python 環境正確配置,并安裝了?numpy
  3. CUDA 支持:如果你有 NVIDIA GPU 并希望啟用 CUDA 加速,可以在?cmake?命令中添加?-D WITH_CUDA=ON?參數。
  4. 內存需求:OpenCV 的編譯可能需要大量內存,建議在有足夠內存的機器上執行。
  5. 文件大小:靜態庫通常比動態庫大得多,因為它們包含完整的實現。
  6. 依賴管理:靜態庫不會自動處理依賴關系,因此需要手動鏈接所有相關的庫。
  7. 編譯時間:靜態庫的編譯時間可能更長,因為它需要生成完整的實現。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/78270.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/78270.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/78270.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

windows 部署Prometheus+Node-expoter

Prometheus v3.2.1 離線部署方式 通過helm部署prometheus會自動部署Node-expoter只需要添加prometheus的抓取規則!! 刪除: 清除之前安裝的 Prometheus 如果你之前已經安裝了 Prometheus,需要清除原有的 Prometheus 安裝&#xf…

HTMLCSS實現網頁輪播圖

網頁中輪播圖區域的實現與解析 在現代網頁設計中&#xff0c;輪播圖是一種常見且實用的元素&#xff0c;能夠在有限的空間內展示多個內容&#xff0c;吸引用戶的注意力。下面將對上述代碼中輪播圖區域的實現方式進行詳細介紹。 一、HTML 結構 <div class"carousel-c…

Linux:進程的概念

基本概念 課本概念&#xff1a;程序的一個可執行實例&#xff0c;正在執行的程序。 內核觀點&#xff1a;擔當分配系統資源實體。 當操作系統要執行程序時&#xff0c;也就是說操作系統要執行代碼&#xff0c;但一個操作系統需要執行多個程序&#xff0c;而CPU只有一塊&#xf…

前端基礎之《Vue(10)—過濾器》

一、過濾器 1、作用 用于數據處理。 2、全局過濾器 使用Vue.filter(名稱, val>{return newVal})定義。 在任何組件中都可以直接使用。 3、局部過濾器 使用選項&#xff0c;filters: {}定義&#xff0c;只能在當前組件中使用。 4、過濾器在Vue 3.0中已經淘汰了 5、過濾器…

平板電腦做歐盟網絡安全法案(EU)2022/30

平板電腦做歐盟網絡安全法案&#xff08;EU&#xff09;2022/30 平板電腦做EN18031,平板電腦做無障礙法規EU2019/882 歐盟委員會于2022年通過補充授權法案 &#xff08;EU&#xff09; 2022/30&#xff0c;明確要求無線電設備需滿足網絡安全、隱私保護及反欺詐要求。 新規時間軸…

Unity中打可選擇的AssetBundle,以及URP中加載AssetBundle包Shader丟失問題顯示洋紅色的解決方案

在上一篇打AssetBundle中已經實現了簡單的打AB包和加載,《Unity中打包AssetBundle并加載》,本篇筆記是進一步上一篇最后提出的問題,進行優化。 一、打可選擇的AssetBundle 每次打包都會把設置了AssetBundle名稱和后綴的所有文件都打包,這也是現在網上教學最多的 但是有時…

解決cannot find attribute `serde` in this scope記錄

問題描述&#xff1a; 在Rust中使用serde做json序列化&#xff0c;需要對一個字段指定序列化方法&#xff0c;添加serde注解后報錯: error: cannot find attribute serde in this scope --> src\models\order_model.rs:38:7 | 38 | #[serde(deserialize_with &qu…

基于whisper和ffmpeg語音轉文本小程序

目錄 一、環境準備 ? 第一步&#xff1a;安裝并準備 Conda 環境 ? 第二步&#xff1a;創建 Whisper 專用的 Conda 虛擬環境 ? 第三步&#xff1a;安裝 GPU 加速版 PyTorch&#xff08;適配 RTX 4060&#xff09; ? 第四步&#xff1a;安裝 Whisper 和 FFMPEG 依賴 ?…

Linux GPIO驅動開發實戰:Poll與異步通知雙機制詳解

1. 引言 在嵌入式Linux開發中&#xff0c;GPIO按鍵驅動是最基礎也最典型的案例之一。本文將基于一個支持poll和異步通知雙機制的GPIO驅動框架&#xff0c;深入剖析以下核心內容&#xff1a; GPIO中斷與防抖處理環形緩沖區設計Poll機制實現異步通知(SIGIO)實現應用層交互方式 …

【最新版】西陸健身系統源碼全開源+uniapp前端

一.系統介紹 一款基于UniappThinkPHP開發健身系統&#xff0c;支持多城市、多門店&#xff0c;包含用戶端、教練端、門店端、平臺端四個身份。有團課、私教、訓練營三種課程類型&#xff0c;支持在線排課。私教可以通過上課獲得收益&#xff0c;在線申請提現功能&#xff0c;無…

濟南國網數字化培訓班學習筆記-第二組-6-輸電線路現場教學

輸電線路現場教學 桿塔組裝 角鋼塔 角鋼-連扳-螺栓 螺栓&#xff08;M&#xff09;&#xff1a; 腳釘-螺栓&#xff08;螺栓頭-無扣長-螺紋-螺帽&#xff09;-墊片-螺帽/防盜帽/防松帽M20*45 表示直徑20mm&#xff0c;長度45mm螺栓級別由一個類似浮點數表示&#xff0c;如…

抖音的逆向工程獲取彈幕(websocket和protobuf解析)

目錄 聲明前言第一節 獲取room_id和ttwid值第二節 signture值逆向python 實現signature第三節 Websocket實現長鏈接請求protubuf反序列化pushFrame反序列化Response解壓和反序列化消息體Message解析應答ack參考博客聲明 本文章中所有內容僅供學習交流使用,不用于其他任何目的…

反射,枚舉,lambda表達式

目錄 反射枚舉的使用Lambda表達式函數式接口語法Lambda表達式語法精簡 變量捕獲Lambda在集合List中的使用 反射 作用&#xff1a;在Java代碼中&#xff0c;讓一個對象認識到自己 比如一個類的名字&#xff0c;里面的方法&#xff0c;屬性等 讓程序運行的過程&#xff0c;某個對…

鴻蒙移動應用開發--渲染控制實驗

任務&#xff1a;使用“對象數組”、“ForEach渲染”、“Badge角標組件”、“Grid布局”等相關知識&#xff0c;實現生效抽獎卡案例。如圖1所示&#xff1a; 圖1 生肖抽獎卡實例圖 圖1(a)中有6張生肖卡可以抽獎&#xff0c;每抽中一張&#xff0c;會通過彈層顯示出來&#xf…

webpack基礎使用了解(入口、出口、插件、加載器、優化、別名、打包模式、環境變量、代碼分割等)

目錄 1、webpack簡介2、簡單示例3、入口(entry)和輸出(output)4、自動生成html文件5、打包css代碼6、優化&#xff08;單獨提取css代碼&#xff09;7、優化&#xff08;壓縮過程&#xff09;8、打包less代碼9、打包圖片10、搭建開發環境&#xff08;webpack-dev-server&#xf…

Java快速上手之實驗4(接口回調)

1&#xff0e;編寫接口程序RunTest.java&#xff0c;通過接口回調實現多態性。解釋【代碼4】和【代碼6】的執行結果為何不同&#xff1f; interface Runable{ void run(); } class Cat implements Runable{ public void run(){ System.out.println("貓急上樹.."…

Volcano 實戰快速入門 (一)

一、技術背景 隨著大型語言模型&#xff08;LLM&#xff09;的蓬勃發展&#xff0c;其在 Kubernetes (K8s) 環境下的訓練和推理對資源調度與管理提出了前所未有的挑戰。這些挑戰主要源于 LLM 對計算資源&#xff08;尤其是 GPU&#xff09;的巨大需求、分布式任務固有的復雜依…

Qwen2.5簡要全流程以及QA

1 輸入prompt 得到input id input id&#xff1a; [B,L] # batch size , lenth 2 embeding之后得到 input_embeds: [B,L,D] # demensions 3 進入Transformer層 先通過linear層得到shape不變的 QKV 多頭注意力 分割Dimension &#xff0c; kv變成 [B,H,L,head_dim] h是…

爬蟲學習——Item封裝數據與Item Pipeline處理數據

一、Item封裝數據 對于有字段的數據&#xff0c;最好的數據結構維護方法為字典類型(dict)&#xff0c;但是由于字典不便于攜帶元數據和傳遞給其他組件使用&#xff0c;故可以使用Item類封裝爬取到的數據。 這里涉及兩個類&#xff1a;Item基類和Field類 兩者的使用關系如下&…

【React】狀態管理 Context API \ MobX \ Redux

Context APIMobXRedux React有自己狀態管理&#xff0c;周邊生態也有很多狀態管理 Context API 直接從react中引入并調用即可&#xff0c;context包含兩個東西&#xff1a; Provider&#xff1a;提供商&#xff08;翻譯&#xff09;&#xff0c;提供數據&#xff1b;屬性&…