zoukankan      html  css  js  c++  java
  • 【转】CV_EXPORT定义的作用,lib及dll的区别

    http://blog.csdn.net/viewcode/article/details/8021989

    在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.csdn.net/viewcode/article/details/8508211 多线程编程中的操作系统概念

  • 相关阅读:
    C# 获取命名空间对应的程序集位置
    启用/禁用以太网的批处理,用于一个网卡切换本地网络和wifi使用(Win10)
    Gogs/Gitea 在 docker 中部署
    bash echo color
    python运行httpserver
    更改当前启动项,开关Hyper-V
    Win10更改CMD控制台的代码页和字体和字号
    ubuntu 编译 vim+lua
    CPU Usage (C#) 测试
    单击改变input的边框颜色
  • 原文地址:https://www.cnblogs.com/dplearning/p/3553305.html
Copyright © 2011-2022 走看看