这一节是我真正使用时遇到的,就是我需要构建动态库,但是这个动态库依赖外部的一些库如opencv、matlab等,那么若何构建这样的动态库呢?构建好如何测试呢?本篇将详细介绍其过程:

1.ubuntu安装opencv

这个大家直接看这篇文章即可:点击opencv安装教程,这里建议大家安装3.x版本的

2.开始构建自己的库,这个库依赖opencv

我的工程文件排布:其中src是我构建库的源文件目录,build是构建库文件的生成目录,同时创建两个CMakeLists.txt, 一个在根目录下,一个在src下。

这里需要强调的是,虽然构建和测试放到一起了,但是他们也可是可以分开的,后面会介绍如何分开。

2.1 根目录下的CMakeLists.txt

# 版本判断
cmake_minimum_required(VERSION 3.0)
# 工程名
project(myproject)# 如果通过安装的方法进行添加,则需要包含一下两个命令,否则编译不通过
# 这里没使用安装的方式,因此注释掉,为了完整性,添加到这里
# include_directories(/home/ubuntu/work/usr/include)
# link_directories(/home/ubuntu/work/usr/lib)# 查找opencv的path
find_package(OpenCV REQUIRED)
# 打印opencv的相关信息
message(STATUS "OpenCV library status:")
message(STATUS "    version: ${OpenCV_VERSION}")
message(STATUS "    libraries: ${OpenCV_LIBS}")
message(STATUS "    include path: ${OpenCV_INCLUDE_DIRS}")# 添加子目录,该目录为库目录,会调用子目录的cmake文件,进行构建库
add_subdirectory(src)
# 构建可执行文件
add_executable(main main.cpp)# 添加链接库
# 把子目录src的编译成的动态库文件链接到这里
target_link_libraries(main mylib ${OpenCV_LIBS})
# 把子目录src编译成的静态库链接到这里
# target_link_libraries(main libmylib.a)
# target_link_libraries(main PRIVATE ${OpenCV_LIBS})
# target_link_libraries(main PRIVATE ${OpenCV_LIBS})

这里简单的把根目录的CMakeLists.txt介绍一下,这里生成的动态库名称为mylib.so,链接动态库时可以直接填入mylib即可,cmake会自动添加完整的libmylib.so,链接静态库时需要填写完整的名称即libmylib.a:

1.在确保你的opencv安装成功的情况下,可以通过  find_package(OpenCV REQUIRED)指令获取opencv的相关信息,如lib、include、version等

2.该cmake文件主要的功能是启动src的CMakeLists.txt去构建库,同时构建可执行文件main

3.这里尤其需要注意的是链接库命令:

target_link_libraries(main mylib ${OpenCV_LIBS})

该命令在链接动态库时,必须把该动态库所有依赖的外部库必须添加进来,否则会构建失败,本工程构建的库所依赖的外部库只有opencv,因此只需把opencv的库添加进来即可。

该命令在链接静态库时,必须填写完整的库名称即可如下:

target_link_libraries(main libmylib.a ${OpenCV_LIBS})

以上就是根目录下的CMakeLists.txt,下面介绍src的CMakeLists.txt。

2.2 src目录下的CMakeLists.txt

# 获取本目录下的所有文件的列表
aux_source_directory(. DIR_LIB_SRCS)
# 设置c++11进行编译,如果使用了c++11的预研特性,必须写这个命令,否则报错
SET( CMAKE_CXX_FLAGS "-std=c++11 -O3")
# 通过如下命令获取opencv的相关信息,这里不采用这样的方式,采用添加目录的方式,这样增加方法的多样性
# find_package(OpenCV REQUIRED)
# message(STATUS "OpenCV library status:")
# message(STATUS "    version: ${OpenCV_VERSION}")
# message(STATUS "    libraries: ${OpenCV_LIBS}")
# message(STATUS "    include path: ${OpenCV_INCLUDE_DIRS}")
# include_directories(${OpenCV_INCLUDE_DIRS})# 安装opencv时我们是可以知道opencv安装的位置的如:/usr/local/include
# 我这里的的源文件也依赖了matlab的运行库,因此也把头文件加载进来了
include_directories(/usr/local/MATLAB/MATLAB_Runtime/v96/extern/include /usr/local/include)
# 把对应的库文件目录也添加进来
link_directories(/usr/local/lib /usr/local/MATLAB/MATLAB_Runtime/v96/extern/bin/glnxa64  /usr/local/MATLAB/MATLAB_Runtime/v96/extern/lib/glnxa64)# 指定编译库输出的位置,这个可以设置也可以不设置
set(LIBRARY_OUTPUT_PATH lib)
# 生成动态库
add_library(mylib SHARED ${DIR_LIB_SRCS})# 生成静态库
add_library(mylib_static STATIC  ${DIR_LIB_SRCS}) # 想要生成动态库和静态库相同名称的的库文件,则需要一个指令set_target_properties
# 这里只是通过重新命名的方法使其名字相同的,构建时还需不能相同
set_target_properties(mylib_static PROPERTIES OUTPUT_NAME "mylib")# 这里为了完整也把安装的命令写了上去,这没使用到他
# 安装共享库和头文件
# 将动态库和静态库安装到<prefix>/lib
install(TARGETS mylib mylib_static LIBRARY DESTINATION lib ARCHIVE DESTINATION lib)
# 安装头文件
install(FILES func.h DESTINATION include)

这里需要讲的几点就是编译时是不需要外部库依赖的,只是在链接时需要外部库的依赖,这里大家需要留心。构建库的过程和我们上一节是一样的,这里不过多的讲解,下面看看生成的结果:

创建build,然后:

cd build
cmake ..
make
make install
./main

 

2.3 通过ldd main跟踪一下看看链接的路径

这里测试动态库需要把根目录下的链接库那里打开动态链接,执行ldd main

测试静态库时,需要把根目录下cmakelists.txt的静态库命令打开:

完整的示例,到这里结束了

cmake使用教程(五)调用opencv外部库和自己生成的库相关推荐

  1. python深度学习库系列教程——python调用opencv库教程

    分享一个朋友的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!大家可以看看是否对自己有帮助:点击打开 全栈工程师开发手册 (作者:栾鹏) python教程全解 OpenCV安装 pip inst ...

  2. ios 静态库合成_iOS生成静态库方法-iOS集成静态库-iOS合并静态库

    在iOS的开发过程中,我们常常用到第三方的库.尤其是QQ.百度地图.广告等. 那么,如何制作自己的库文件呢? 如果,将自己写的功能类编译成库文件,分发给其他人来使用呢? 静态库的优点 编译静态库的好处 ...

  3. Linux下CMake简明教程(五)正规一点的组织结构

    代码在git 正规一点来说,一般会把源文件放到src目录下,把头文件放入到include文件下,生成的对象文件放入到build目录下,最终输出的elf文件会放到bin目录下,这样整个结构更加清晰.让我 ...

  4. QT调用opencv的videowrite类输出生成视频打不开(已解决)

    用尽网上所有方法都不行,最后发现是因为用了网上的方法QImage转Mat后就发生这样的情况,至今不知道原因. 解决方法是把每一张图片都用imwrite在本地保存再用imread读出来再保存成视频.最后 ...

  5. ubuntu 16.04 配置Python2.7 和 Python3.5 同时调用OpenCV

    安装OpenCV OpenCV 官网,下载见 SourceForge and GitHub. 若使用官网版本安装不成功,则可试试Github版本. 或者 git clone https://githu ...

  6. cmake使用教程(四)调用外部共享库和头文件

    文件组织形式: 创建根目录test1,在根目录下创建CMakeLists.txt文件和src文件夹,在src/目录下创建CMakeLists.txt和main.cpp,其中根目录下面的CMakeLis ...

  7. matlab调用opencv库,matlab调用opencv库

    matlab中有许多图像处理的函数简单方便,比如矩阵x 求垂直积分 直接sum(x) 就可以了.不知道OPENCV里面有没有类似的功能,反正我是没找到.就准备用matlab调用OPENCV里面的函数. ...

  8. ubuntu15.10下安装opencv2.4.9python上调用opencv库

    对于centos,可以参考:Install OpenCV-Python in Fedora 如果IPP难以下载可以在cmake时禁掉它,只需:cmake -DWITH_IPP=OFF OpenCV3. ...

  9. Qt中调用OpenCV函数库时Crashed问题的解决。

    这几天想在虚拟机上搭建Ubuntu的开发环境,包括了Matlab和QT(C++)的开发工具安装等,同时由于做图像处理,所以还必须要安装FFMPEG和OpenCV库.下面就讲讲我们安装时出现qt中调用O ...

最新文章

  1. 20天持续压测,告诉你云存储性能哪家更强?
  2. .py与.pyc文件区别
  3. BZOJ 1012 最大数
  4. 用哈希桶实现错位字组的分类(Group Anagrams)
  5. 为什么有很多人认为“深圳是举全国之力发展起来的?
  6. 全国计算机等级考试题库二级C操作题100套(第58套)
  7. 大学计算机老师都是IT行业顶尖,却不做程序员,你知道为什么吗
  8. Session优缺点
  9. GemBox Spreadsheet Professional 2.9
  10. C语言· 实现各进制间的相互转换
  11. 关于 GBK编码表与编码字库
  12. JAVA系统蓝屏_Tomcat启动系统蓝屏
  13. Fluent验证案例05:管道中的泊肃叶流动
  14. java编程细节总结(一):等于号的作用
  15. 皕杰报表之小程序代码质量检测
  16. 【多线程/线程池】项目中实际应用场景
  17. torchtext.vocab
  18. 基于alios系统门禁uart串口应用编写
  19. Feign客户端异常IOException: Incomplete output stream解决方案
  20. 黑马程序员————集合2(day17)

热门文章

  1. 黄聪:C#中用ILMerge将所有引用的DLL和exe文件打成一个exe文件,有图解
  2. 自由的意义--读《希腊的回声》
  3. structs - 标签库(html)
  4. Python安装时import matplotlib.pyplot as plt报错
  5. 《python自动化》学习笔记:电话地址和E-mail地址提取程序
  6. 经典卡尔曼滤波器直接调用代码(Matlab)
  7. mdstyle暂存备用
  8. 编辑距离(线性DP+暴力匹配)
  9. AcWing 889. 满足条件的01序列(卡特兰数)
  10. 比较大小教案计算机西瓜,比较大小小班教案