CV_EXPORT定义的作用,lib及dll的区别

在core.hpp中,CV_EXPORT是出现频率最高的词之一。

1. CV_EXPORT是什么? 有什么用?

2. CV_EXPORT会涉及到dll的东西,那么dll是什么,lib与dll的区别是什么?


CV_EXPORTS 出现的用法:

class CV_EXPORTS MatExpr;

template<typename _Tp> class CV_EXPORTS Size_;


CV_EXPORT的定义:

#if (defined WIN32 || defined WIN64) && defined CVAPI_EXPORTS
    #define CV_EXPORTS __declspec(dllexport)
#else
    #define CV_EXPORTS
#endif

实质上就是__declspec(dllexport)的定义:

msdn对其解释:

http://msdn.microsoft.com/zh-cn/library/a90k134d(v=vs.80).aspx

在更新的编译器版本中,可以使用 __declspec(dllexport) 关键字从 DLL 导出数据、函数、类或类成员函数。

__declspec(dllexport) 会将导出指令添加到对象文件中,因此在指定的对象文件里您不需要使用 .def 文件。当试图导出 C++ 修饰函数名时,这种便利最明显。


若要导出类中的所有公共数据成员和成员函数,关键字必须出现在类名的左边。


其他概念:

动态链接库中定义有两种函数:导出函数(export   function)和内部函数(internal   function)。 
导出函数可以被其它模块调用,内部函数在定义它们的DLL程序内部使用。 

MFC提供的修饰符号_declspec(dllexport) 就是表示导出函数或变量。

模块定义文件(.DEF)是一个或多个用于描述DLL属性的模块语句组成的文本文件。

----------------------------------------------------------


lib与dll的区别:

1. 使用方式有什么不同?

2. 原因是什么?


其实lib无论怎么样,都会用到。

一种是lib单独使用,另外一种是lib+dll的方式(平时所说的dll的方式)。

lib单独使用:

1. LIB包含函数代码本身,不仅包含头文件,还有源码,在编译时直接将代码加入程序当中,称为静态链接库static link library。链接生成的程序可以独立运行。

    即lib文件是静态编译出来的,索引和实现都在其中。

2. 同一机器,多个同种程序运行,每个程序都会加载一份代码库。

3. 任何改动,都需要重新编译、链接,这个对大型的程序非常不便,升级也麻烦。有时,在更改数据结构时,需要重新编译整个工程,而非只编译、链接单个lib。


lib+dll方式:

1. LIB包含了函数所在的DLL文件和文件中函数位置的信息(入口),代码由运行时加载在进程空间中的DLL提供,称为动态链接库dynamic link library。生成的程序需要dll配合使用。

    即lib一般是一些索引信息,记录了dll中函数的入口和位置,dll中是函数的具体内容。应用程序使用LIB文件链接到DLL文件。在应用程序的可执行文件中,存放的不是被调用的函数代码,而是DLL中相应函数代码的地址,从而节省了内存资源。

2. 多个程序运行,共享一份代码。节省内存。

3. 当 DLL 中的函数发生更改时,只要函数的参数和返回值没有更改,就不需重新编译或重新链接使用它们的应用程序。


使用方式的差别:

1. 静态lib
需要.h和lib。
在生成lib时,相当于cpp编译的obj的集合。链接时,指定lib的位置。

2. 动态lib
实质上是dll的使用方式。
在生成dll时,会生成一个lib,lib里包含的是索引信息。
编译链接时,需要.h,lib。
运行时,需要程序和dll。

有关dll和lib的信息还很多,暂时理解到这个层面吧。

msdn的链接:

http://msdn.microsoft.com/zh-cn/library/dtba4t8b(v=vs.80).aspx


runtime library如何选择?

参考 http://blog.youkuaiyun.com/viewcode/article/details/8508211 多线程编程中的操作系统概念

### 如何将 OpenCV 4.10 封装为 DLL 文件 #### 准备工作 为了成功创建基于 OpenCV 的动态链接库 (DLL),需要先安装配置好 Visual Studio 和 CMake 工具环境。确保已下载并解压了 OpenCV 源码包,版本应匹配指定的 4.10 版本。 #### 配置项目结构 建立一个新的 Windows 动态链接库(DLL)工程,在解决方案资源管理器里右键点击项目名称->属性->C/C++ ->常规->附加包含目录中加入 OpenCV 头文件路径;同样地,在连接器->常规->附加库目录下添加 lib 路径[^1]。 #### 编写导出函数定义头文件 创建一个 .h 文件用于声明要暴露给外部使用的接口: ```cpp #pragma once #ifdef MYOPENCVLIBRARY_EXPORTS #define MYOPENCVDLL_API __declspec(dllexport) #else #define MYOPENCVDLL_API __declspec(dllimport) #endif extern "C" { MYOPENCVDLL_API void* CreateImage(int width, int height); MYOPENCVDLL_API void DestroyImage(void *imgPtr); } ``` 此部分代码实现了简单的图像对象创建销毁功能接口声明。 #### 实现对应的 cpp 文件中的逻辑处理 接着实现上述两个方法的具体操作过程,这里简化示意如下: ```cpp #include "opencv2/opencv.hpp" using namespace cv; class ImageWrapper { public: Mat img; }; extern "C" { MYOPENCVDLL_API void* CreateImage(int width, int height){ try{ auto wrapper = new ImageWrapper(); wrapper->img.create(height,width,CV_8UC3); // 注意参数顺序是height first. return static_cast<void*>(wrapper); }catch(...){ return nullptr; } } MYOPENCVDLL_API void DestroyImage(void *imgPtr){ if(imgPtr!=nullptr){ delete reinterpret_cast<ImageWrapper*>(imgPtr); } } } ``` 这段程序片段展示了如何利用 `cv::Mat` 类型来存储图像数据,并通过自定义类包裹起来以便于跨语言边界传递。 #### 使用 CMakeLists.txt 构建系统描述构建流程 最后一步是在项目的根目录放置一份名为 CMakeLists.txt 的文本文件,内容大致如下所示: ```cmake cmake_minimum_required(VERSION 3.17) project(MyOpenCVLibrary VERSION 1.0 LANGUAGES CXX) set(CMAKE_CXX_STANDARD 14) set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) find_package(OpenCV REQUIRED) add_library(${PROJECT_NAME} SHARED src/my_opencv_functions.cpp) target_include_directories(${PROJECT_NAME} PRIVATE ${OpenCV_INCLUDE_DIRS}) target_link_libraries(${PROJECT_NAME} PRIVATE ${OpenCV_LIBS}) install(TARGETS ${PROJECT_NAME} DESTINATION bin) install(FILES include/*.h DESTINATION include/${PROJECT_NAME}) ``` 这份脚本指定了编译选项以及依赖关系,其中包含了寻找本地安装好的 OpenCV 库的位置信息,并将其关联到当前正在开发的目标上。 完成以上步骤之后就可以借助 cmake 命令行工具或者图形界面来进行最终产物——即目标平台上的 dll 文件的实际生成动作了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值