cmake-动态库和静态库及使用OpenCV第三方库

这篇具有很好参考价值的文章主要介绍了cmake-动态库和静态库及使用OpenCV第三方库。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


 项目中会有单个源文件构建的多个可执行文件的可能。项目中有多个源文件,通常分布在不同子目录中。这种实践有助于项目的源代码结构,而且支持模块化、代码重用和关注点分离。同时,这种分离可以简化并加速项目的重新编译。

静态库

准备的文件

add.h

int add(int a,int b);

add.cpp

int add(int a,int b)
{
    return a+b;    
}

main.cpp

#include "add.h"
#include <iostream>
int main()
{
    int a = 3,b = 4;
    std::cout<<add(3,4)<<std::endl;
    return 0;    
}

CMakeLists文件

cmake-动态库和静态库及使用OpenCV第三方库,cmake,c++,c++
 首先这是我们的目录结构。我们需要先编译静态库,所以我们会在外层的CMakeLists.txt文件中先编译add文件夹中的静态库。
所以外层CMakeLists.txt文件的内容为:

add_subdirectory(add)

add文件夹中的CMakeLists.txt文件

add_library(add_static add.cpp)

 add_library(add_static STATIC add.cpp):生成必要的构建指令,将指定的源码编译到库中。add_library的第一个参数是目标名。整个CMakeLists.txt中,可使用相同的名称来引用库。生成的库的实际名称将由CMake通过在前面添加前缀lib和适当的扩展名作为后缀来形成。生成库是根据第二个参数(STATIC或SHARED)和操作系统确定的。

使用静态库

 接下来我们需要在外层main.cpp文件中使用该静态库。

add_subdirectory(add)

include_directories(./lib)
add_executable(lesson2_1 main.cpp)
target_link_libraries(lesson2_1 ${CMAKE_CURRENT_SOURCE_DIR}/lib/add_static.lib)

 target_link_libraries(lesson2_1 ${CMAKE_CURRENT_SOURCE_DIR}/lib/add_static.lib): 将库链接到可执行文件。此命令还确保可执行文件可以正确地依赖于静态库。因此,在静态链接到可执行文件之前,需要完成静态库的构建。
 我们先把编译好的静态库和头文件放到lib文件夹下。
cmake-动态库和静态库及使用OpenCV第三方库,cmake,c++,c++
最后的编译结果。
cmake-动态库和静态库及使用OpenCV第三方库,cmake,c++,c++

动态库

准备的文件

add.cpp

#include <iostream>
#include "export.h"

CMAKE_STUDY_API int add(int a,int b)
{
    return a+b;    
}

add.h

#include "export.h"
CMAKE_STUDY_API int add(int a,int b);

export.h

#pragma once

#ifdef EXPORT
#define CMAKE_STUDY_API __declspec(dllexport)
#else
#define CMAKE_STUDY_API __declspec(dllimport)
#endif

main.cpp

#include "add.h"
#include <iostream>
int main()
{
    int a = 3,b = 4;
    std::cout<<add(3,4)<<std::endl;
    return 0;    
}

CMakeLists文件

cmake-动态库和静态库及使用OpenCV第三方库,cmake,c++,c++
以上为目录结构
 与静态库一样,我们都需要先编译动态库,然后再编译可执行文件。
所以我们外部的CMakeLists.txt文件为:

add_subdirectory(add)

add文件夹下的CMakeLists.txt文件为:

add_library(add_shared SHARED add.cpp)
target_compile_definitions(add_shared PRIVATE EXPORT)

由于在windows下的动态库需要有宏定义来指定动态库是导出还是导入。
cmake-动态库和静态库及使用OpenCV第三方库,cmake,c++,c++
target_compile_definitions(add_shared PRIVATE EXPORT)主要是用来定义该动态库有个自定义的宏EXPORT。

使用动态库

 与静态库不同,在windows下我们生成的动态库会有一个lib文件和一个dll文件,lib文件是动态库函数的导出符号文件。
外部的CMakeLists.txt文件:

add_subdirectory(add)

include_directories(./lib)
add_executable(lesson2_2 main.cpp)
target_link_libraries(lesson2_2 ${CMAKE_CURRENT_SOURCE_DIR}/lib/add_shared.lib)

cmake-动态库和静态库及使用OpenCV第三方库,cmake,c++,c++
我们先把头文件和lib文件都拷贝到lib文件夹下。
然后再把生成的dll文件拷贝到生成的可执行文件的目录下。否则会出现缺失dll文件的错误。
cmake-动态库和静态库及使用OpenCV第三方库,cmake,c++,c++
cmake-动态库和静态库及使用OpenCV第三方库,cmake,c++,c++
最后的执行结果。

使用OpenCV库

 我们先从官网上下载OpenCV的库。
cmake-动态库和静态库及使用OpenCV第三方库,cmake,c++,c++
main.cpp

#include<iostream>

#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>

using namespace std;
using namespace cv;

int main(int argc, char** argv)    
{                                  
	Mat image;
	image = imread("C:/cmake_study/lesson2_opencv/1.jpeg");
	if (image.data == nullptr)
	{
		//cout <<"图片不存在" << endl;
	}
	else
	{
		imshow("meinv", image);
		waitKey(0);
	}

	//cout << "图像宽为:" << image.cols << "\t高度为:" << image.rows << "\t通道数为:" << image.channels() << endl

	system("pause");
	return 0;
}

CMakeLists.txt文件

include_directories(C:/3rd/opencv/build/include)
add_executable(lesson2_opencv main.cpp)
target_link_libraries(lesson2_opencv "C:/3rd/opencv/build/x64/vc16/lib/opencv_world480d.lib")

我们只需要指定OpenCV的lib文件的路径和头文件即可,最后将dll文件拷贝到可执行文件的目录下。
cmake-动态库和静态库及使用OpenCV第三方库,cmake,c++,c++文章来源地址https://www.toymoban.com/news/detail-820280.html

到了这里,关于cmake-动态库和静态库及使用OpenCV第三方库的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ESP32工程中CMake使用及加入第三方SDK库文件

            本文中使用的是乐鑫官方推出的 ESP-IDF v5.1 对 ESP32S3 设备开发,并非是Arduino、Micro-python等第三方工具开发。在ESP-IDF框架中,乐鑫官方已经将 CMake 和 Ninja 编译构建工具 集成到了ESP-IDF中。         ESP-IDF 即乐鑫物联网开发框架,可为在 Windows、Linux 和 macOS 系统平台

    2024年02月20日
    浏览(51)
  • 动态库和静态库的使用

    库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。就是将源代码转化为二进制格式的源代码,相当于进行了加密,别人可以使用库,但是看不到库中的内容。 常见的库类型 共享库 静态库 动态库 win32平台下,静态库通常后缀为.lib,动态库为.dll 。 linux平台下

    2024年02月03日
    浏览(83)
  • 【Linux】如何打包成动静态库,第三方动静态库如何使用?

    库的名称:去掉前面的 lib 去掉后面的 .a(版本号) .so(版本号) 剩下的,才是库正真的名称。 查看文件依赖库: ldd r : replace (更新替换) c:create (建立) 使用 gcc -fPIC 创建 .o 文件 (PIC)position ignoring code 与位置无关码 用 gcc -shared 打包 .o 文件 -shared 共享库 / 动态库 当我们有

    2024年02月14日
    浏览(42)
  • arduino怎么导入第三方库和官方库

    一. 导入第三方库文件 # 找到arduino安装程序选的安装位置,例如如果是下面的位置的话 # 那就在D:softwareArduino下找到libraries  # 然后再把下载的第三方库文件移动到里面,比如我下载了一个I2Cdev的三方库 # I2Cdev里的文件是这样的:  # 然后你就能在arduino的加载库找到,找不到的可

    2024年02月12日
    浏览(50)
  • 轻松精通PyCharm:高效管理第三方库和虚拟环境

      在pycharm中安装第三方库的方法有多种,下面我会详细介绍其中一种, 在终端进行安装 ,操作简单,且成功率高。并且,我会详细介绍,如何在pycharm的虚拟环境中安装第三方库,以及 如何提高安装速度 。   本文用的工具是PyCharm 2021.3.3,专业版。 如果工具版本不同,

    2024年01月16日
    浏览(42)
  • Linux中静态库和动态库的使用

    介绍: 库是一个二进制文件,包含的代码可被程序调用 标准C库、数学库、线程库… 库有源码,可下载后编译;也可以直接安装二进制包 位置一般放在:/lib /usr/lib 库的知识 库是事先编译好的,可以复用的代码 在os上运行的程序基本上都要使用库,使用库可以提高开发效率

    2024年01月25日
    浏览(35)
  • Qt Creator导入第三方so库和jar包——Qt For Android

    之前了解了在Android Studio下导入so库和jar包,现在实现如何在Qt上导入so库和jar包。 下面是我安卓开发(需调用安卓接口的代码)的目录(图1),此目录结构和原生态环境(Android Studio)下开发的结构很相似: 图1 在Qt  Creator上导入so库和jar包,比在Android Studio上简单很多,只需

    2024年04月29日
    浏览(43)
  • 详解Linux下静态库/动态库的生成和使用(含代码示例和操作流程)&&动态库和静态库的区别

    关于gcc的使用方法可以参考下方链接博客: Linux下详解gcc编译过程(含代码示例) gcc使用教程 库是一种组件技术。 库里封装了数据和函数,提供给用户程序调用。 库只执行到第三阶段编译,没有链接。 库的使用可以使程序模块化,提高程序的编译速度,实现代码复用。

    2024年02月15日
    浏览(42)
  • CMake Install 安装第三方依赖库

    cmake 提供 install 命令来安装文件,方便打包。但是有时也会对第三方依赖库有需求一起打包,在不确定第三方库dll文件路径和名称的情况下,需要另一种方式来打包了。 比如想要打包opencv_world.dll,一般cmake依赖opencv的方式是通过第三方软件包(* -config.cmake)的方式: 那么在

    2024年02月14日
    浏览(43)
  • 【cmake学习】cmake 引入第三方库(头文件目录、库目录、库文件)

    程序的编写需要用到头文件,程序的编译需要lib文件,程序的运行需要dll文件,因此cmake引入第三方库其实就是将include目录、lib目录、bin目录引入工程。         目录 1、find_package(批量引入库文件和头文件) 2、include_directories(引入头文件目录) 3、link_directories(引入库

    2024年02月09日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包