精华内容
下载资源
问答
  • 选择DLL文件,自动生成DEF文件和LIB文件
  • dll文件生成使用

    千次阅读 2013-05-23 09:11:53
    dll文件生成  vc编译器与gcc的编译原理是一样的,个别的函数像printf可能编译结果不大一样。程序生成的基本过程就是编译,链接。编译大体上也分三部分,预处理,编译,汇编,因为编译过程最复杂,所以这三步一般合...


    dll文件生成

        vc编译器与gcc的编译原理是一样的,个别的函数像printf可能编译结果不大一样。程序生成的基本过程就是编译,链接。编译大体上也分三部分,预处理,编译,汇编,因为编译过程最复杂,所以这三步一般合起来叫编译。以前的有讨论过http://blog.csdn.net/ysu108/article/details/7529273。每个.cpp文件在windows都会生成一个obj目标文件,头文件不参与编译(在vc下头文件右击是灰色的),只有在链接的时候与库一起生成可执行文件。

        动态链接在Linux下是.o文件,在windows就是dll文件,原理和作用是一样的,使用动态链接库的优点上面的文章也说过,msdn上也有提到http://msdn.microsoft.com/zh-cn/library/dtba4t8b(v=vs.80).aspx。一些常用的dll库一般放在C:\WINDOWS\system32下,如果想注册一个dll可以拷贝一份,然后regsvr32命令注册一份。注册时候要注意dll所在目录是不可以有中文的,如果dll错误,那么有两种情况,版本不对和dll文件缺失。

    使用ace库时候链接出现问题,dll文件和头文件都有了,链接的时候LNK2001:unresolved external symbol错误,查了下感觉自己不清楚dll文件的生成原理,自己操作下如何生成dll文件。

    微软的Visual C++支持三种DLL,它们分别是Non-MFC Dll(非MFC动态库)、Regular Dll(常规DLL)、Extension Dll(扩展DLL)。Non-MFC DLL指的是不用MFC的类库结构,直接用C语言写的DLL,其导出的函数是标准的C接口,能被非MFC或MFC编写的应用程序所调用。Regular DLL和的Extension Dlls一样,是用MFC类库编写的。

    我们已经知道DLL是包含若干个函数的库文件,应用程序使用DLL中的函数之前,应该先导出这些函数,以便供给应用程序使用。要导出这些函数有两种方法,一是在定义函数时使用导出关键字_declspec(dllexport),另外一种方法是在创建DLL文件时使用模块定义文件.Def。需要读者注意的是在使用第一种方法的时候,不能使用DEF文件。下面通过两个例子来说明如何使用这两种方法创建DLL文件。

    1)使用导出函数关键字_declspec(dllexport)创建MyDll.dll,该动态链接库中有两个函数,分别用来实现得到两个数的最大和最小数。在MyDll.h和MyDLL.cpp文件中分别输入如下原代码:
     

    //MyDLL.h
    extern "C" _declspec(dllexport) int Max(int a, int b);
    extern "C" _declspec(dllexport) int Min(int a, int b);
    //MyDll.cpp
    #include
    #include"MyDll.h"
    int Max(int a, int b)
    {
    	if(a>=b)return a;
    	else
    	return b;
    }
    int Min(int a, int b)
    {
    	if(a>=b)return b;
    	else
    	return a;
    }

      该动态链接库编译成功后,打开MyDll工程中的debug目录,可以看到MyDll.dll、MyDll.lib两个文件。LIB文件中包含DLL文件名和DLL文件中的函数名等,该LIB文件只是对应该DLL文件的"映像文件",与DLL文件中,LIB文件的长度要小的多,在进行隐式链接DLL时要用到它。读者可能已经注意到在MyDll.h中有关键字"extern C",它可以使其他编程语言访问你编写的DLL中的函数。

    2)用.def文件创建工程MyDll

      为了用.def文件创建DLL,请先删除上个例子创建的工程中的MyDll.h文件,保留MyDll.cpp并在该文件头删除#include MyDll.h语句,同时往该工程中加入一个文本文件,命名为MyDll.def,再在该文件中加入如下代码:

    LIBRARY MyDll
    EXPORTS
    Max
    Min

      其中LIBRARY语句说明该def文件是属于相应DLL的,EXPORTS语句下列出要导出的函数名称。我们可以在.def文件中的导出函数后加@n,如Max@1Min@2,表示要导出的函数顺序号,在进行显式连时可以用到它。该DLL编译成功后,打开工程中的Debug目录,同样也会看到MyDll.dll和MyDll.lib文件。

    动态链接库DLL的链接

      应用程序使用DLL可以采用两种方式:一种是隐式链接,另一种是显式链接。在使用DLL之前首先要知道DLL中函数的结构信息。Visual C++6.0在VCin目录下提供了一个名为Dumpbin.exe的小程序,用它可以查看DLL文件中的函数结构。另外,Windows系统将遵循下面的搜索顺序来定位DLL: 1.包含EXE文件的目录,2.进程的当前工作目录, 3.Windows系统目录, 4.Windows目录,5.列在Path环境变量中的一系列目录。

    1.隐式链接

      隐式链接就是在程序开始执行时就将DLL文件加载到应用程序当中。实现隐式链接很容易,只要将导入函数关键字_declspec(dllimport)函数名等写到应用程序相应的头文件中就可以了。下面的例子通过隐式链接调用MyDll.dll库中的Min函数。首先生成一个项目为TestDll,在DllTest.h、DllTest.cpp文件中分别输入如下代码:
      

    //Dlltest.h
    #pragma comment(lib,"MyDll.lib")
    extern "C"_declspec(dllimport) int Max(int a,int b);
    extern "C"_declspec(dllimport) int Min(int a,int b);
    //TestDll.cpp
    #include
    #include"Dlltest.h"
    void main()
    {int a;
    a=min(8,10)
    printf("比较的结果为%d ",a);
    }
     

      在创建DllTest.exe文件之前,要先将MyDll.dll和MyDll.lib拷贝到当前工程所在的目录下面,也可以拷贝到windows的System目录下。如果DLL使用的是def文件,要删除TestDll.h文件中关键字extern "C"。TestDll.h文件中的关键字Progam commit是要Visual C+的编译器在link时,链接到MyDll.lib文件,当然,开发人员也可以不使用#pragma comment(lib,"MyDll.lib")语句,而直接在工程的Setting->Link页的Object/Moduls栏填入MyDll.lib既可。

    关于_declspec(dllimport)

           在编译的过程中发现也可以在头文件中直接生命函数的原形,不用_declspec(dllimport) int Max来导入函数,而是头文件中直接是函数的原形int Max(),同样能实现函数导入的功能。下面是这两个关键字的介绍:

    __declspec(dllexport)

    声明一个导出函数,是说这个函数要从本DLL导出。我要给别人用。一般用于dll中
    省掉在DEF文件中手工定义导出哪些函数的一个方法。当然,如果你的DLL里全是C++的类的话,你无法在DEF里指定导出的函数,只能用__declspec(dllexport)导出类

    __declspec(dllimport)

    声明一个导入函数,是说这个函数是从别的DLL导入。下面使用时候的注意点(来自MSDNhttp://msdn.microsoft.com/zh-cn/library/8fskxacy(v=VS.80).aspx):
    1)不使用 __declspec(dllimport) 也能正确编译代码,但使用 __declspec(dllimport) 使编译器可以生成更好的代码。编译器之所以能够生成更好的代码,是因为它可以确定函数是否存在于 DLL 中,这使得编译器可以生成跳过间接寻址级别的代码。但是,必须使用 __declspec(dllimport) 才能导入DLL 中使用的变量。

    2)若要提高代码的可读性,请为 __declspec(dllimport) 定义一个宏,然后使用此宏声明每个导入的符号

    #define DllImport   __declspec( dllimport )
    
    DllImport int  j;
    DllImport void func();

    3)对 DLL 和客户端应用程序可以使用相同的头文件。为此,请使用特殊的预处理器符号来指示是生成 DLL 还是生成客户端应用程序。例如:

    #ifdef _EXPORTING
       #define CLASS_DECLSPEC    __declspec(dllexport)
    #else
       #define CLASS_DECLSPEC    __declspec(dllimport)
    #endif
    
    class CLASS_DECLSPEC CExampleA : public CObject
    { ... class definition ... };
    

      

    2.显式链接

      显式链接是应用程序在执行过程中随时可以加载DLL文件,也可以随时卸载DLL文件,这是隐式链接所无法作到的,所以显式链接具有更好的灵活性,对于解释性语言更为合适。不过实现显式链接要麻烦一些。在应用程序中用LoadLibrary或MFC提供的AfxLoadLibrary显式的将自己所做的动态链接库调进来,动态链接库的文件名即是上述两个函数的参数,此后再用GetProcAddress()获取想要引入的函数。自此,你就可以象使用如同在应用程序自定义的函数一样来调用此引入函数了。在应用程序退出之前,应该用FreeLibrary或MFC提供的AfxFreeLibrary释放动态链接库。下面是通过显式链接调用DLL中的Max函数的例子。
     

    #include
    #include
    void main(void)
    {
    typedef int(*pMax)(int a,int b);
    typedef int(*pMin)(int a,int b);
    HINSTANCE hDLL;
    PMax Max
    HDLL=LoadLibrary("MyDll.dll");//加载动态链接库MyDll.dll文件;
    Max=(pMax)GetProcAddress(hDLL,"Max");
    A=Max(5,8);
    Printf("比较的结果为%d ",a);
    FreeLibrary(hDLL);//卸载MyDll.dll文件;
    }

      在上例中使用类型定义关键字typedef,定义指向和DLL中相同的函数原型指针,然后通过LoadLibray()将DLL加载到当前的应用程序中并返回当前DLL文件的句柄,然后通过GetProcAddress()函数获取导入到应用程序中的函数指针,函数调用完毕后,使用FreeLibrary()卸载DLL文件。在编译程序之前,首先要将DLL文件拷贝到工程所在的目录或Windows系统目录下。

      使用显式链接应用程序编译时不需要使用相应的Lib文件。另外,使用GetProcAddress()函数时,可以利用MAKEINTRESOURCE()函数直接使用DLL中函数出现的顺序号,如将GetProcAddress(hDLL,"Min")改为GetProcAddress(hDLL, MAKEINTRESOURCE(2))(函数Min()在DLL中的顺序号是2),这样调用DLL中的函数速度很快,但是要记住函数的使用序号,否则会发生错误。

     

    问题解决:ace链接失败LNK2001错误

    1)编译时候没有找到ace.lib文件,光在VC的tools->options->directories里面的Library files添加目录是不行的,这个lib在编译的时候要写入exe文件的,不可能把目录下所有的lib全部写入文件,要在工程中制定,有两个方法,一个是在头文件中加上#pragma comment(lib, "ace.lib"),还有就是直接在project->settings->link的library modules加上ace.lib

    2)使用ACE的库,主函数名字必须为int ACE_TMAIN(int, ACE_TCHAR *[]),否则会报符号错误。

     

    一个小问题:release与debug版本
    两个版本的软件在源代码上没有本质的区别,这个只是编译的选项,编译器在两个不同的版本下对编译链接时可能不同,release的时候编译器会做一些优化处理。msdn上的找到的“Debug Mode is used when a Developer develop a application and release mode is used when a developer deliver a project that project should be in release mode.So it's depend in which senario you are asking this question.In a debug build the complete symbolic debug information is emitted to help while debugging applications and also the code optimization is not taken into account. While in release build the symbolic debug info is not emitted and the code execution is optimized. Also, because the symbolic info is not emitted in a release build, the size of the final executable is lesser than a debug executable.”

     

    /// 2014/5/17 add

     C++导出的接口

    宏定义:#define ADAPTER_DLL_API __declspec(dllexport)

    优点:

    (1)      允许函数重载,即类中可以存在重名的函数

    (2)      可以保证导出接口和使用接口的一致性,即可以直接使用导出的头文件

    (3)      当接口名字或者参数类型和个数发生变化时,可以通过编译迅速定位问题。

    (4)      可以将多个DLL工程和一个Exe工程放在一个大工程中,设置编译顺序和依赖关系,可以简单的编译、连接和运行。

    缺点:

    (1)      如果没有该DLL或者DLL的平台不匹配,运行相关的Exe程序会失败。

    (2)      发布版本需要头文件,Lib文件,DLL文件

     

    C导出的接口

    宏定义:#define ADAPTER_DLL_API extern"C" __declspec(dllexport)

    函数如下:

    // 加载C接口的DLL文件资源

    HINSTANCE LoadLibrary(

     LPCTSTR lpLibFileName

    );

    // 通过函数名查找相应的函数指针

    FARPROC GetProcAddress(

     HMODULE hModule,

     LPCWSTR lpProcName

    );

    // 释放DLL文件资源

    BOOL FreeLibrary(

     HMODULE hLibModule

    );

     

    优点:

    (1)      如果没有该DLL或者DLL的平台不匹配,可以运行相关的Exe程序,只是相关的功能用不上,其他的功能照样可以使用。

    (2)      不需要相关的lib文件,降低了调用程序与DLL的程序的耦合性。

    (3)      不需要以前的接口的情况下,包括增加接口和修改接口实现的下,不需要重新编译整个程序。

    缺点:

    (1)      不允许函数重载

    (2)      发布版本需要头文件和DLL文件

    (3)      需要增加一个接口文件,调用LoadLibrary(),GetProcAddress(),FreeLibrary()函数。

     

    参考:
    http://msdn.microsoft.com/zh-cn/library/vstudio/527z7zfs.aspx
    http://blog.sina.com.cn/s/blog_56e4248c0100c4xg.html

     

    展开全文
  • 由DEF和DLL文件生成LIB文件步骤

    千次阅读 2010-05-20 11:12:00
    (from http://blog.sina.com.cn/s/blog_4cb133e501000a3c.html) 由DEF和DLL文件生成LIB文件步骤用DEF和DLL文件生成LIB文件需要采用VC工具集中的LIB.EXE工具,最好的办法如下: 1.新建一个目录,例如:e:/mydll2.将...

    (from http://blog.sina.com.cn/s/blog_4cb133e501000a3c.html)

     

    由DEF和DLL文件生成LIB文件步骤
    用DEF和DLL文件生成LIB文件需要采用VC工具集中的LIB.EXE工具,最好的办法如下:
     
    1.新建一个目录,例如:e:/mydll
    2.将def和dll文件拷贝到该目录下,例如:SQLITE3.DEF,SSQLITE3.DLL
    3.从VC安装目录下的/BIN/下将LIB.EXE 拷贝到e:/mydll下
    4.在命令行状态进入e:/mydll
    5.执行LIB命令,可能提示找不到LINK.exe文件,将VC安装目录下的/BIN/ LINK.EXE拷贝到e:/mydll下
    6.再次执行LIB命令,可能提示找不到MSPDB60.DLL,从网上下载MSPDB60.DLL,拷贝到e:/mydll下
    7.在e:/mydll 命令行状态下,执行LIB /DEF:SQLITE3.DEF /MACHINE:IX86,生成LIB文件。
    展开全文
  • 根据DLL文件生成LIB文件和def文件

    千次阅读 2018-03-06 11:40:32
    D:\Program Files\VideoLAN\VLC\libvlc.dll" > "D:\Program Files\VideoLAN\VLC\libvlc.def"echo EXPORTS > libvlc.def for /f "usebackq tokens=4,* delims...

    首先打开VS的命令提示符,依次输入下面的命令(以VLC为例)

    dumpbin /exports "D:\Program Files\VideoLAN\VLC\libvlc.dll" > "D:\Program Files\VideoLAN\VLC\libvlc.def"
    echo EXPORTS > libvlc.def
    for /f "usebackq tokens=4,* delims=_ " %i in (`dumpbin /exports "D:\Program Files\VideoLan\VLC\libvlc.dll"`) do if %i==libvlc echo %i_%j >> libvlc.def
    lib /def:"D:\Program Files\VideoLAN\VLC\libvlc.def" /out:"D:\Program Files\VideoLAN\VLC\libvlc.lib" /machine:x86

    展开全文
  • 前言 当使用第三方dll的时候,有时会错过编译它所需的根据.lib文件。本文讲述了如何从.dll...2、dll文件。(本文以plpgsql.dll为例) 步骤 1、打开vs2013,TOOLS -> Visual Studio Command Promt,打开命...

    前言

    当使用第三方dll的时候,有时会错过编译它所需的根据.lib文件。本文讲述了如何从.dll生成.lib文件,下面是我总结的步骤。

    下载

    1、Visual Studio 2013 (以2013为例,版本都大同小异)

    2、dll文件。(本文以plpgsql.dll为例)

    步骤

    1、打开vs2013,TOOLS -> Visual Studio Command Promt,打开命令行

    2、现在运行dumpbin命令来获得dll的所有导出函数的列表:

    dumpbin /exports C:\yourpath\yourlib.dll

    3、创建.def文件

    现在复制所有这些函数名(只有name!)并粘贴到一个新的文本文件。命名yourlib.def,并将“EXPORTS”行放在它的顶部。我的yourlib.def文件如下:

    EXPORTS
    _magic_func
    _PG_init
    exec_get_datum_type
    exec_get_datum_type_info
    pg_finfo_plpgsql_call_handler
    pg_finfo_plpgsql_inline_handler
    pg_finfo_plpgsql_validator
    plpgsql_DumpExecTree
    plpgsql_HashTableInit
    plpgsql_IdentifierLookup
    plpgsql_add_initdatums
    plpgsql_adddatum
    ...

    现在,从这个定义文件中,可以创建.lib文件了。为此,我们使用“lib”命令,因此在Visual Studio命令提示符中运行以下命令:

    lib /def:C:\mypath\mylib.def /OUT:C:\mypath\mylib.lib /machine:x86

    好了,你的lib生成完毕。如下图:

     

    不了解命令的直接在命令行敲:lib

     

    展开全文
  • VS2012 C语言dll文件生成和C#调用

    千次阅读 2015-06-16 20:37:13
    用C#做Web项目时,需要使用C实现的加密算法,将加密算法封装成dll文件以便在C#中调用,第一次使用dll,做个简单记录。 1. 在需要调用的函数前面添加 __declspec(dllexport)。 使2.用命令行生成dll,使用VS2012的...
  • 从.dll文件生成mingw下的.a文件

    千次阅读 2017-11-17 16:19:29
    1、下载pexport.exe  资源:... 2、pexport.exe a.dll > a.def 3、使用qt下的dlltool工具如果安装的是qt全家桶安装包,默认目录是Qt\Tools\mingw492_32\bin下的dlltool.exe 4、。。。Qt\Tools
  • 在VS中给自己的dll文件生成版本信息

    千次阅读 2018-06-08 14:58:02
     当前使用的编译工具是Visio studio 2015在编辑器中打开自己的工程找到资源文件目录-》右键单击呼出二级菜单添加-》三级目录中选择资源如下图:在选择资源后你将看到如下图,在资源文件中选择version,然后在则可在...
  • 我们的目的就是生成指定的.lib文件,现在却说无法找到,原因是没有添加生成lib的目录和文件名。 下面介绍一下整体的生成流程: 第一步:找到LIB.EXE所在目录 C:\\Program Files\Microsoft Visual Studio ...
  • 在VS2010下由DEF和DLL文件生成SQLite3.lib

    千次阅读 2011-10-31 11:29:17
    一.准备工作: (1)在SQLite的官方网站下载Windows平台下的最新版本的SQLite, 下载地址:...压缩文件中包含了sqlite3.dll和sqlite3.def文件.   (2)运行Visual Studio Command Prompt(2010), 用LIB命
  • C# 生成DLL文件

    2009-04-23 14:12:16
    C# 生成DLL文件C# 生成DLL文件C# 生成DLL文件C# 生成DLL文件C# 生成DLL文件C# 生成DLL文件C# 生成DLL文件
  • NET 编译生成DLL文件

    2011-11-03 09:46:43
    NET 编译生成DLL文件 NET 编译生成DLL文件 NET 编译生成DLL文件 NET 编译生成DLL文件 NET 编译生成DLL文件 NET 编译生成DLL文件 NET 编译生成DLL文件
  • Dll文件生成

    千次阅读 2015-05-27 21:33:38
    步骤: 创建类库-》编写方法-》(更改属性-》生成-》输出->XML文档文件)生成项目,然后就可以再bin\debug目录下找到生成Dll文件了,如果输出XML文档文件,则Dll文件有注释其他程序引用: 添加应用到应用程序,再...
  • VB.NET 生成DLL文件 调用DLL文件

    千次阅读 2018-02-28 21:02:48
    VB.NET 生成DLL文件 调用DLL文件打开VS2013选择 类库 (1)写入一下代码Public Class Class1 Public Function world() world=“哈喽世界!” End FunctionEnd Class(2)选择 生成——生成world.DLL文件Class1...
  • 朗读和生成声音文件 dll文件 朗读和生成声音文件 dll文件
  • 1.vs2015下生成DLL文件文件->新建->项目点击确定选择dll选项和空项目选项点击完成 为项目添加c++源文件mydll.cppextern "C" // 此处extern "c" 为解决c/c++兼容问题 { _declspec...
  • C++ dll库只生成dll文件,而未生成lib文件的问题逐项检查 逐项检查 新建项目时,选择应用程序类型为dll,并勾选“Export Symbols”; 属性->链接器->高级->导入库 中定义输出...
  • DLL导出生成lib文件

    2017-11-02 00:50:04
    对于没有lib文件DLL,在VC中需要引用,怎么操作呢。这个工具就是实现该功能的,附带一个命令使用例子。
  • Labview生成dll文件的方法,总结的文档和使用实例。
  • cs编译成DLL文件cs文件如何生成exe,dll文件以下是本人的制作过程:1.E盘下有一个Test.cs 文件。2.开始-》程序-》Microsoft Visual Studio 2005-》Visual Studio Tools-》Visual Studio 2005 命令提示3.命令提示...
  • 由动态库文件dll生成lib库文件

    万次阅读 2014-06-18 11:02:55
    本文基于OpenBlas的编译和安装,来说明如何从一个dll文件生成lib库文件。 参考OpenBlas的说明“Howto generate import library for MingW”,和MinGW的说明HOWTO Create an ImportLibrary for a DLL using MinGW,...
  • C 语言调用matlab生成DLL文件
  • vs工程生成dll文件及其调用方法

    万次阅读 多人点赞 2019-06-12 16:33:00
    vs工程生成dll文件及其调用方法1、vs工程中dll文件生成1.1、将生成exe文件的工程修改为生成dll文件1.2、新建工程生成dll文件2、关于dll文件的调用 1、vs工程中dll文件生成 1.1、将生成exe文件的工程修改为生成...
  • C语言生成DLL文件

    千次阅读 2016-12-29 21:34:06
    生成DLL文件 http://blog.csdn.net/taohuaxinmu123/article/details/11761719 1:新建Win32控制台应用程序。 2:选择下一步,DLL。 3:新生成DLL目录结构 将写好的.h及.c文件添加到工程...
  • c语言动态链接文件dll和.so文件生成

    千次阅读 2019-05-13 21:23:11
    c语言动态链接文件dll和.so...使用c语言版eclipse生成dll文件,具体eclipse设置参考:https://blog.csdn.net/csdncqmyg/article/details/53170548。 eclipse下载地址:链接:https://pan.baidu.com/s/1HcFw-wDr_...
  • Dev c++工具将C代码生成dll文件以及如何调用dll文件

    万次阅读 多人点赞 2017-08-03 17:47:18
    该篇文章是对工作中一个需求的总结,工作需求是要将C语言的函数接口,生成一个DLL文件,让labview调用。然后我尝试用devc++开发工具来实现这个功能,后来因为DLL生成了,但labview调用的结果和C执行的结果不一致,...
  • 一、代码封装成dll文件 步骤一:创建工程 图1:创建生成dll的工程 图2 图3 图4: 注意此处需要勾选QtCore,因为后面需要使用该库内QtCore/qglobal.h文件中的 Q_DECL_EXPORT 类 ...
  • 1、新建C#类库 2、项目中新建一个类和方法 3、项目引用unity的dll文件 ...7、根据生成路径找到生成DLL文件,添加到unity中,并将test脚本挂载到Main Camera 将unity中test.cs脚本删除 运行成功打...
  • 项目中包含了一个可以生成dll的C++项目,利用C++项目生成dll文件,一个C#的控制台程序调用C++的dll,以及写项目的参考链接和一个大的异常的处理办法

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 220,991
精华内容 88,396
关键字:

dll文件生成