㈠ 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也可以进行打断点调试)。