㈠ OpenCV靜態庫編譯與鏈接
以OpenCV-4.0.0為例說明在Ubuntu環境下的靜態庫編譯與鏈接方法:
opencv依賴第三方的庫,所以當把opencv編譯成靜態庫的時候,注意要把它運行時必要的依賴庫也編譯進來,opencv源碼內有自己的3rdparty,主要有:libjpeg、libpng、libtiff、libzlib、libwebp、libprotobuf、ffmpeg(用到video時編譯)、libgtk(用於顯示界面顯示,伺服器部署不會用到),可以通過cmake -LA來查看配置的編譯信息,再根據信息考慮把opencv的哪些mole編譯進來。
鏈接時指定opencv的靜態庫以及依賴的庫。另外需要注意頭文件的問題,通過CMakeLists把opencv加入項目編譯時,由於opencv編譯完成後要install才會把所用的頭文件集中拷貝到一個地方,所以事先將頭文件拷貝到了項目的opencv目錄下。
㈡ cmake編譯單/多文件
在該路徑下會生成一個文件夾(CMakeFiles),三個文件(Makefile, CMakeCache.txt, cmake_install.cmake)以及一個程序(addition)
此時的文件目錄結構為
該項目該依賴於MPI,GDAL和cereal庫。MPI和GDAL庫自行編譯
1.配置各種編譯的時候,可以使用set設置,更多詳情,請自行搜索。
2.頭文件的包含請使用include_directories。
3.搜索源文件請使用aux_source_directory。
4.第三脊滾基方庫的查找使用 find_package。例如我們想找GDAL, 那麼 find_package(GDAL), 它會在 /usr/share/cmake/Moles 文件中的FindGDAL.cmake文件中去找GDAL的各種信息。前提是GDAL 是make install的, FindGDAL.cmake中才會有GDAL的各種信息。否則的話,我們需要set自行制定GDAL的相關信息。
5.第三方庫的鏈接用target_link_libraries。
注意,也櫻謹可以將該項目中的某個文件夾編譯成靜態庫,然備隱後在於其餘源文件鏈接,可以參考: https://blog.csdn.net/cliukai/article/details/90670243
簡單的多文件編譯: https://blog.csdn.net/cliukai/article/details/90670243
有第三方庫的文件編譯: https://blog.csdn.net/fb_help/article/details/79593037
㈢ windows下怎麼使用cmake生成.a的靜態庫
您好,很高興為您解答:
在使用cmake時,CMakeLists.txt的寫法如下: add_library( ${MODULE_NAME} SHARED ${CMAKE_SOURCE_DIR}/builttime.c #要生成一個so,至少要包含一個源文件,實在沒有可以把庫的編譯時間戳打到這兒。 ) target_link_libraries( ${MODULE_NAME} ${${MODULE_NAME}_EXTRA_LDFLAGS} "-Wl,--whole-archive" #告訴編譯器,
從這里開始,所有的庫的內容都包含到so中 ${LOCAL_MODULES} #可以是以源代碼生成的靜態庫 ${PREBUILT_MODULES} #可以是預先生成的靜態庫 "-Wl,--no-whole-archive" #告訴編譯器,從這里開始,以後的庫的內容不用都包含到so中 )
㈣ 如何編譯帶有extra molesopencv
從opencv官網下載下來的exe文件安裝後只含有opencv自帶的一些moles,有時需要其extra moles的一些功能,就需要手動編譯。
這里詳細的說明了opencv自帶的moles和extra moles
環境說明
Windows10 x64
Opencv 3.1.0
Visual Studio 2015
CMAKE 3.4.1
第一部分:生成OpenCV vs項目
下載opencv源碼和 opencv_contrib源碼 這里的opencv源碼部分用官網的exe安裝包解壓安裝也可以。需要的只是源碼。
!!!注意:這里OpenCV和OpenCV contrib的代碼版本要一致,否則可能後產生不可預知的編譯錯誤!!!
將opencv和opencv_contrib解壓到一個目錄里,並建立一個空文件夾名為VSproject,用來存儲待編譯的vs項目
打開CMAKE,在where is the source code裡面選擇opencv的源代碼目錄,我安裝的是exe包,所以我的目錄是F:/Sunday/opencv/sources
在where to build the binaries選擇F:/Sunday/VSproject
點擊Configure,選擇你的編譯器,如下
點擊Finish
等待出現Configuring done
找到OPENCV_EXTRA_MODULES_PATH項,輸入opencv_contrib下的moles目錄F:/Sunday/opencv_contrib/moles
如下
其他選項根據自己的需要勾選,不懂的話就不要動了。
我取消勾選的有
BUILD_DOCS
BUILD_TESTS
BUILD_PERF_TESTS
BUILD_opencv_python2
BUILD_opencv_python3
WITH_CUDA
WITH_MATLAB
注意:千萬不要勾選BUILD_opencv_contrib_world和BUILD_opencv_world,否則會導致編譯失敗。但是如果
不添加opencv_contrib的話,就可以勾選BUILD_opencv_world,這樣編譯出來的庫文件和dll就只有一個
opencv_world.dll。包含了所有的庫。
再次點擊Configure沒問題的話上面不會有紅色,如下
7. 點擊Generate,開始生成VS項目
導出成功如下,顯示Genereating done
第二部分:編譯
打開VSproject目錄下的OpenCV.sln,我的是F:\Sunday\VSproject\OpenCV.sln
先編譯debug版本的代碼,同時要確保平台正確,在ALL_BUILD項目上右鍵→生成,即開始編譯。這個過程一般較長。
編譯成功後生成CMake Targets下的install項目,這樣所有opencv編譯出來的lib,dll,頭文件都會統一放在install文件夾下。
把編譯改為Release模式,按照1~3步再編譯一下。
最終所有編譯好的文件都會存在VSproject的install目錄下。
㈤ 如何才能使CMake生成的可執行程序便於調試
出現的原因是導入的此makefile工程不是debug模式的,所以不包含調試信息,自然不能打斷點調試了。因此,要解決這個問題就要考慮如何修改CMakeLists.txt使其生成的makefile文件進而生成Debug模式下的帶調試信息的可執行程序;
我們先寫一個簡單的測試例子來測試一下,如何加調試信息:
假設文件結構如下:
./test6
|
+ ------ CmakeLists.txt
+ ------ main.cpp
+ ------ src_a
|
+ ------ CmakeLists.txt
+ ------ Testa.h
+ ------ Testa.cpp
+ ------ src_so
|
+ ------ CmakeLists.txt
+ ------ Testso.h
+ ------ Testso.cpp
第一步:test6目錄下CmakeLists.txt
cmake_minimum_required(VERSION 3.3)
project(main )
add_subdirectory(src_a ) // 給當前工程目錄添加子目錄 src_a
add_subdirectory(src_so ) // 給當前工程目錄添加子目錄 src_so
set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb") //添加調試信息
set(EXECUTABLE_OUTPUT_PATH $ {PROJECT_SOURCE_DIR}/bin) //設置可執行文件的生成路徑
include_directories($ {PROJECT_SOURCE_DIR}/src_a ${PROJECT_SOURCE_DIR}/src_so) //包含庫頭文件
aux_source_directory(. DIR_SRCS ) // 將當前目錄中的源文件名稱賦值給變數 DIR_SRCS
add_executable(main $ {DIR_SRCS}) //表示 DIR_SRCS中的源文件需要編譯成名為 main的可執行文件
target_link_libraries (main Testa Testso) //將庫文件鏈接到生成的目標可執行文件
第二步:子目錄目錄下CmakeLists.txt
1,src_a中靜態庫的編譯生成
cmake_minimum_required(VERSION 3.3) //該命令限定了 CMake 的版本
set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb") //添加調試信息
set(LIBRARY_OUTPUT_PATH $ {PROJECT_SOURCE_DIR}/bin) //設置Lib 靜態庫生成路徑
aux_source_directory(. LIBA_SRC) //將當前目錄中的源文件名稱賦值給變數 LIBA_SRC
add_library(Testad STATIC $ {LIBA_SRC}) //將變數 LIBA_SRC中的源文件編譯為靜態庫,庫文件名稱為 Testa
2,src_so中動態庫的編譯生成
cmake_minimum_required(VERSION 3.3) //該命令限定了 CMake 的版本
set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb") //添加調試信息
set(LIBRARY_OUTPUT_PATH $ {PROJECT_SOURCE_DIR}/bin) //設置Lib 動態庫庫生成路徑
aux_source_directory(. LIBSO_SRC) //將當前目錄中的源文件名稱賦值給變數 LIBA_SRC
add_library(Testsod SHARED $ {LIBSO_SRC}) //將變數 LIBA_SRC中的源文件編譯為動態庫,庫文件名稱為 Testso
此處執行cmake時有兩種方式:
1,在cmake的gui界面中設定生成Debug模式,
2,在執行cmake時使用如下命令:cmake -DCMAKE_BUILD_TYPE=Debug/Release path
關於ccmake的使用,這里簡單的做個說明:
1.首先在終端啟動cmake的gui界面:"ccmake ." 效果如圖:
2.然後在gui中輸入"c",效果如圖:
3.然後在gui中輸入"e",效果如圖:
4.此時在gui界面點擊"enter"回車鍵進行編輯:編輯完再次點擊回車退出編輯。
5.點擊"c",之後再次點擊"g"。此時makefile文件已經生成好了。make之後生成的可執行文件是帶有調試信息的,就可用gdb進行調試了(導入Eclipse也可以進行打斷點調試)。