ubuntu12.04中opencv靜態編譯
ubuntu12.04中opencv靜態編譯
1.12.04中沒有了新立德,忍受不了軟體中心的慢,所以安裝了新立德
apt-get install synaptic
2.安裝gcc等C/C++編程相關工具
sudo apt-get install build-essential
3.安裝gtk+(opencv的介面顯示就靠它了)
安裝GTK環境只要安裝一個libgtk2.0-dev就可以了,而安裝gnome開發環境的話,需要裝gnome-core-devel,它包含GTK開發包。
sudo apt-get install gnome-core-devel(有點慢,需要下載,看網速)
pkg-config --modversion gtk+ (查看1.2.x版本)
pkg-config --modversion gtk+-2.0 (查看 2.x 版本)
pkg-config --version (查看pkg-config的版本)
pkg-config --list-all |grep gtk (查看是否安裝了gtk)
4.使用synaptic安裝cmake-qt版本
有介面的cmake配置opencv編譯選項方便些
5.安裝wxWidgets(codeblocks IDE需要到)V2.8(詳情見)
由於codeblocks是用wxWidgets開發的,所以wxWidgets需要先安裝.以最小化體積為編譯目的,shared,unicode版本,庫檔案編譯為一個檔案,不支援2.8,去掉debug資訊,最終配置命令如下(./configure --help可查看參數資訊):
./configure --enable-unicode --enable-shared--enable-monolithic --disable-compat28 --disable-debug_flag
make(需要一定時間)
make install
ldconfig(需要把/usr/local/lib加到/etc/ld.so.conf最後一行中,再執行ldconfig)
編譯後的檔案放在/usr/local/bin和/usr/local/lib目錄中,可通過—prefix改變路徑.
由於Codeblocks暫時只支援2.8,所以卸載2.9的:make uninstall.重新安裝2.8
./configure --enable-unicode --enable-shared--enable-monolithic --disable-compat26 --disable-debug_flag
make(需要一定時間)
make install
6.安裝CodeBlocks(Ver10.05)
Codeblocks最新版本10.05(截至2012-5-12)只能使用wxWidgets2.8,不相容2.9.使用2.9會出現以下錯誤:editarrayorderdlg.h:20:error: default argument for parameter of type 'const wxArrayString&' hastype 'long int'. 且wxWidgets需編譯成單一檔案.原始碼下的BUILD檔案裡面有編譯說明.直接順序執行以下三條命令就行.
./configure --with-contrib-plugins=all
make
make install
安裝完成後,開啟它只發現它在工作列中閃一會兒就消失了,出不了介面.在終端得運行提示:codeblocks:error while loading shared libraries: libcodeblocks.so.0: cannot open sharedobject file: No such file or directory
解決辦法為:In that case make sure the library path where the Code::Blocks librarieswhere installed into is "known" to the system. For example: On Ubuntuusing a default build process on a clean system will install the Code::Blocksexecutables to /use/local/bin
and the libraries to /usr/local/lib. The latteris usually not known to a "clean" Ubuntu system. To add it to thesearch path for libraries do the following (as root / using sudo respectively):Add the following line to the file /etc/ld.so.conf:
/usr/local/lib
...and run:
ldconfig
That's it - Code::Blocks should now work just fine asall libraries are being found.
wxSmith用不了,開啟CB提示:
/usr/local/lib/codeblocks/plugins/libwxSmithAui.so:not loaded (missing symbols?)
/usr/local/lib/codeblocks/plugins/libwxsmithcontribitems.so:not loaded (missing symbols?)
/usr/local/lib/codeblocks/plugins/libwxsmith.so: notloaded (missing symbols?)
運行 sudo ldconfig就行
7.安裝ffmpeg(Ver0.10.3)
需要先安裝ffmpeg(先安裝yasm),下載原始碼,
./configure --enable-shared(需要動態連結)
make
makeinstall
ldconfig四步就行.
如果機子以前安裝過ffmpeg,需要先卸載乾淨。本人使用synaptic裝過0.8版本,最後使用synaptic卸載了,但libav*等庫檔案還存在,所以怎樣編譯ffmpeg都是連結到0.8的那些庫,都會是出錯。
只要libavdevice,filter,format,codec,swresample,swscale,avutil這7個庫中有連結到以下目錄的,就是連結到了舊檔案。
/usr/lib/i386-linux-gnu/,/usr/lib/i386-linux-gnu/i686/cmov/。應該連結到/usr/local/lib目錄裡才是正確的。
解決辦法:
刪除/usr/lib/i386-linux-gnu/,/usr/lib/i386-linux-gnu/i686/cmov/這兩個目錄裡相應的檔案,然後重新ldconfig,再ldd `which ffmpeg`查看ffmpeg庫的連結情況,如果都連結到了/usr/local/lib目錄裡的相關庫,則成功。不行則把上面2個目錄裡的相關庫檔案刪除了再編譯連結。
8.安裝opencv(Ver2.4.2)
使用cmake編譯,
取消BUILD_JASPER JPEG PNG TIFF ZLIB(linux的思想是共用,所以使用系統的映像庫,沒有則先安裝)
BUILD_SHARED_LIBSBUILD_PERF_TESTS BUILD_TESTS(由於靜態庫,沒有指定ffmpeg相關庫檔案,這些Tests會編譯失敗)
編譯並安裝完成後,使用pkg-config查看標頭檔與庫檔案資訊
root@ubuntu:~# pkg-config opencv --cflags
//查看包含目錄
-I/usr/local/include/opencv -I/usr/local/include
root@ubuntu:~# pkg-config opencv --libs
//查看庫連結,可見該格式是錯誤的,沒有-L與-l標識,所以需要自己添加
/usr/local/lib/libopencv_contrib.a/usr/local/lib/libopencv_legacy.a /usr/local/lib/libopencv_ml.a/usr/local/lib/libopencv_stitching.a /usr/local/lib/libopencv_ts.a/usr/local/lib/libopencv_videostab.a /usr/local/lib/libopencv_gpu.a/usr/local/lib/libopencv_nonfree.a
/usr/local/lib/libopencv_objdetect.a/usr/local/lib/libopencv_calib3d.a /usr/local/lib/libopencv_photo.a/usr/local/lib/libopencv_video.a /usr/local/lib/libopencv_features2d.a/usr/local/lib/libopencv_highgui.a/usr/local/share/OpenCV/3rdparty/lib/liblibjasper.a/usr/local/share/OpenCV/3rdparty/lib/liblibtiff.a/usr/local/share/OpenCV/3rdparty/lib/liblibpng.a/usr/local/share/OpenCV/3rdparty/lib/liblibjpeg.a/usr/local/lib/libopencv_flann.a
/usr/local/lib/libopencv_imgproc.a/usr/local/lib/libopencv_core.a /usr/local/share/OpenCV/3rdparty/lib/libzlib.aswscale avformat avutil z avcodec gstvideo-0.10 gstapp-0.10 xml2 gmodule-2.0gstreamer-0.10 gstbase-0.10 gthread-2.0 glib-2.0 gobject-2.0 fontconfigfreetype
pango-1.0 cairo gdk_pixbuf-2.0 pangocairo-1.0 pangoft2-1.0 gio-2.0atk-1.0 gdk-x11-2.0 gtk-x11-2.0 rt pthread m dl stdc++
9.測試opencv
標頭檔位置設定:codeblocks中 項目—Build option-Compiler settings--otheroptions 中加入`pkg-config opencv --cflags`
庫連結參數設定:codeblocks中 項目—Build option-Linker settings--other linkeroptions 中加入`pkg-config opencv --libs`,由前面可知靜態編譯完成後的opencv得到的libs格式不正確,所以需要手動改為正確格式再輸出otherlinker options中(具體參數見下表分析)。
包 含 界 面 庫 (highgui) |
靜 態 鏈 接 (-static) |
鏈 接 參 數 |
-static -lopencv_contrib -lopencv_legacy -lopencv_ml -lopencv_stitching -lopencv_videostab -lopencv_gpu -lopencv_nonfree -lopencv_objdetect -lopencv_calib3d -lopencv_photo -lopencv_video -lopencv_features2d -lopencv_highgui -llibjasper -llibtiff -llibpng -llibjpeg -lopencv_flann -lopencv_imgproc -lopencv_core -lswscale -lavformat -lavcodec -lavutil -lva -lzlib -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgio-2.0 -lpangoft2-1.0 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lcairo -lpango-1.0 -lfreetype -lfontconfig -lgobject-2.0 -lglib-2.0 -lgthread-2.0 -lrt -lpthread -lm -ldl -lstdc++ |
連結不成功 |
產生 檔案 依賴 項 |
連結不成功: 因為gtk中atk,gdk_pixbuff這兩個庫只有動態庫,沒有靜態表,無法進行表述連結。安裝這些庫的靜態庫可解決問題。 |
動 態 鏈 接 (-shared) |
鏈 接 參 數 |
-lopencv_contrib -lopencv_legacy -lopencv_ml -lopencv_stitching -lopencv_videostab -lopencv_gpu -lopencv_nonfree -lopencv_objdetect -lopencv_calib3d -lopencv_photo -lopencv_video -lopencv_features2d -lopencv_highgui -llibjasper -llibtiff -llibpng -llibjpeg -lopencv_flann -lopencv_imgproc -lopencv_core -lswscale -lavformat -lavcodec -lavutil -lva -lzlib -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgio-2.0 -lpangoft2-1.0 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lcairo -lpango-1.0 -lfreetype -lfontconfig -lgobject-2.0 -lglib-2.0 -lgthread-2.0 -lrt -lpthread -lm -ldl -lstdc++ |
成功,可運行 |
生 成 文 件 依 賴 項 |
linux-gate.so.1 libva.so.1 libgtk-x11-2.0.so.0 libgdk-x11-2.0.so.0 libgobject-2.0.so.0 libglib-2.0.so.0 librt.so.1 libpthread.so.0 libstdc++.so.6 libm.so.6 libgcc_s.so.1 libc.so.6 libdl.so.2 libpangocairo-1.0.so.0 libX11.so.6 libXfixes.so.3 libatk-1.0.so.0 libcairo.so.2 libgdk_pixbuf-2.0.so.0 libgio-2.0.so.0 libpangoft2-1.0.so.0 libpango-1.0.so.0 libfontconfig.so.1 libXext.so.6 libXrender.so.1 libXinerama.so.1 libXi.so.6 libXrandr.so.2 libXcursor.so.1 libXcomposite.so.1 libXdamage.so.1 ibffi.so.6 libpcre.so.3 /lib/ld-linux.so.2 libfreetype.so.6 libxcb.so.1 libpixman-1.so.0 libpng12.so.0 libxcb-shm.so.0 libxcb-render.so.0 libz.so.1 libgmodule-2.0.so.0 libselinux.so.1 libresolv.so.2 libexpat.so.1 libXau.so.6 libXdmcp.so.6 |
不 包 含 界 面 庫 (highgui) |
靜 態 鏈 接 (-static) |
鏈 接 參 數 |
-static -L/usr/local/lib -L/usr/local/share/OpenCV/3rdparty/lib -lopencv_contrib -lopencv_legacy -lopencv_ml -lopencv_stitching -lopencv_videostab -lopencv_gpu -lopencv_nonfree -lopencv_objdetect -lopencv_calib3d -lopencv_photo -lopencv_video -lopencv_features2d -lopencv_highgui -llibjasper -llibtiff -llibpng -llibjpeg -lopencv_flann -lopencv_imgproc -lopencv_core -lzlib -lswscale -lavutil -lavformat -lavcodec -lxml2 -lgmodule-2.0 -lgstreamer-0.10 -lgstbase-0.10 -lgthread-2.0 -lglib-2.0 -lgobject-2.0 -lfontconfig -lfreetype -lpango-1.0 -lcairo -lpangocairo-1.0 -lpangoft2-1.0 -lgio-2.0 -lgdk-x11-2.0 -lgtk-x11-2.0 -ldl -lm -lpthread -lrt -lstdc++ |
成功,可以運行 |
組建檔案依賴項 |
目標程式沒有連結動態庫not a dynamic executable,即不依賴於任何檔案,比MS牛 |
動 態 鏈 接 (-shared) |
鏈 接 參 數 |
-shared -L/usr/local/lib -L/usr/local/share/OpenCV/3rdparty/lib -lopencv_contrib -lopencv_legacy -lopencv_ml -lopencv_stitching -lopencv_videostab -lopencv_gpu -lopencv_nonfree -lopencv_objdetect -lopencv_calib3d -lopencv_photo -lopencv_video -lopencv_features2d -lopencv_highgui -llibjasper -llibtiff -llibpng -llibjpeg -lopencv_flann -lopencv_imgproc -lopencv_core -lzlib -lswscale -lavutil -lavformat -lavcodec -lxml2 -lgmodule-2.0 -lgstreamer-0.10 -lgstbase-0.10 -lgthread-2.0 -lglib-2.0 -lgobject-2.0 -lfontconfig -lfreetype -lpango-1.0 -lcairo -lpangocairo-1.0 -lpangoft2-1.0 -lgio-2.0 -lgdk-x11-2.0 -lgtk-x11-2.0 -ldl -lm -lpthread -lrt -lstdc++ |
運行不了,提示Illegal instruction (core dumped) |
產生 檔案 依賴 項 |
linux-gate.so.1 => (0x00f82000) libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0x00a02000) librt.so.1 => /lib/i386-linux-gnu/librt.so.1 (0x00ea4000) libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0x0030d000) libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0x008e6000) libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x00bf2000) /lib/ld-linux.so.2 (0x005ec000) libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0x003f2000) |
出錯處理:
/usr/bin/ld: cannot find -lgstvideo-0.10
/usr/bin/ld: cannot find -lgstapp-0.10
/usr/bin/ld: cannot find -lgdk_pixbuf-2.0
/usr/bin/ld: cannot find -latk-1.0
(使用-static參數就會出現上面的錯誤)把庫連結參數中的-lgstvideo-0.10-lgstapp-0.10 -lgdk_pixbuf-2.0 -latk-1.0四項去掉(每項對應一個錯誤)