`
king_c
  • 浏览: 225418 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

lib and dll

 
阅读更多

   使用静态调用方式时,需要将在生成动态链接库时产生的lib文件添加到应用程序工程中去,对要使用的DLL中的函数只须声明一下即可,而无需调用LoadLibrary和FreeLibrary对DLL进行现式加载、卸载。这里用到lib文件是与dll文件相对应的导入文件,包含有每一个DLL导出函数的符号名和可选的标志号,但不含实际代码。LIB文件作为DLL的替换文件被编译到应用程序中。在程序员以静态调用方式编译生成应用程序时,应用程序中的调用函数将与lib文件中的导出符号相匹配,这些符号或者标志号进入新生成的可执行文件中。lib文件中包含了对应的dll文件名,链接程序将其存储在可执行文件中。一旦需要动态链接库就会根据这些信息有操作系统加载动态链接函数,所有被应用程序调用的dll文件都会在应用程序exe被加载到内存的同时被加载到内存中去。操作系统系统在加载使用可执行程序的同时加载相应的动态链接库,有可执行程序直接通过函数名来调用dll中的各个输出函数,其调用方法与调用程序内部的函数式一样的。
  在进行动态调用时,应用程序使用LoadLibrary或MFC 提供的AfxLoadLibrary显式加载动态链接库,以dll文件名作为函数的参数,在调用GetProcAddress获取想要引入的函数.就可以像使用应用程序内部函数一样调用此函数的。在退出应用程序之前,要显式的调用FreeLibrary或者MFC提供的AfxFreeLibrary显示的卸载动态链接库。
  例如: extern "C" __declspec(dllexport) double SquareRoot(double d);
       可用如下代码对其进行动态调用:
       typedef double (SQRTPROC ) (double);
       HINTSTNACE hInstance;
       SQRTPROC *pFunction;
       hInstance = ::LoadLibrary("Test.dll");
       pFunction = (SQRTPROC *)::GetProcAddress(hInstance,"SquareRoot");
       double d = (*pFunction )(81.0);

函数指针
#include <iostream
#include <string
using namespace std; 
 
int test(int a); 
 
void main(int argc,charargv[])   

    cout<<test<<endl; 
    typedef int (*fp)(int a);//注意,这里不是生命函数指针,而是定义一个函数指针的类型,这个类型是自己定义的,类型名为fp 
    fp fpi;//这里利用自己定义的类型名fp定义了一个fpi的函数指针! 
    fpi=test; 
    cout<<fpi(5)<<"|"<<(*fpi)(10)<<endl; 
    cin.get(); 

 
int test(int a) 

    return a; 
}

 

 

 

 

.dll是在你的程序运行的时候才连接的文件,因此它是一种比较小的可执行文件格式,.dll还有其他的文件格式如.ocx等,所有的.dll文件都是可执行。

 

.lib是在你的程序编译连接的时候就连接的文件,因此你必须告知编译器连接的lib文件在那里。一般来说,与动态连接文件相对比,lib文件也被称为是静态连接库。当你把代码编译成这几种格式的文件时,在以后他们就不可能再被更改。如果你想使用lib文件,就必须:
包含一个对应的头文件告知编译器lib文件里面的具体内容
设置lib文件允许编译器去查找已经编译好的二进制代码


如果你想从你的代码分离一个dll文件出来代替静态连接库,仍然需要一个lib文件。这个lib文件将被连接到程序告诉操作系统在运行的时候你想用 到什么dll文件,一般情况下,lib文件里有相应的dll文件的名字和一个指明dll输出函数入口的顺序表。如果不想用lib文件或者是没有lib 件,可以用WIN32 API函数LoadLibraryGetProcAddress。事实上,我们可以在Visual C++ IDE中以二进制形式打开lib文件,大多情况下会看到ASCII码格式的C++函数或一些重载操作的函数名字。


.h文件是在编译的时候才用到的

.lib文件是在链接的时候才用到的

.dll文件是在运行的时候才用到的

 

一般我们最主要的关于lib文件的麻烦就是出现unresolved symble 这类错误,这就是lib文件连接错误或者没有包含.c.cpp文件到工程里,关键是如果在C++工程里用了C语言写的lib文件,就必需要这样包含:

 

extern "C"
{
#include "myheader.h"
}


这是因为C语言写的lib文件没有C++所必须的名字破坏,C函数不能被重载,因此连接器会出错。

 

===============================

VC中不用MFC如何制作dll

方法一:使用export  import

VC中建立一个Console Application,建立2个文件:Dll.h  Dll.cpp

Dll.h

#ifdef MYLIBAPI
#else
#define MYLIBAPI extern "C" _declspec (dllimport)
#end if

MYLIBAPI int Add (int iLeft, int iRight) 
MYLIBAPI int Sub (int iLeft, int iRight) 

Dll.cpp

#define MYLIBAPI extern "C" _declspec (dllexport)

#include "Dll.h"

int Add (int iLeft, int iRight)
{
return iLeft + iRight ;
}

int Sub (int iLeft, int iRight)
{
return iLeft - iRight ;
}

保存文件。
Project->setting->link 最下面加上 “/dll” "/"之前一定要与前一项
有空格。
然后编译,就可以在debug  release下面找到dll  lib 文件了
使用的时候包含dll.h文件

 


方法二:使用def文件
建立一个console application, 建立2个文件dll.h  dll.cpp

Dll.h

int Add (int iLeft, int iRight) ;
int Sub (int iLeft, int iRight) ;

Dll.cpp

#include "Dll.h"

int Add (int iLeft, int iRight)
{
return iLeft + iRight ;
}

int Sub (int iLeft, int iRight)
{
return iLeft - iRight ;
}

然后再当前目录下面建立一个.def文件,文件名最好和要输出的dll名字一样,扩展名
.def, 里面写上:

LIBRARY dllname.dll
EXPORTS
Add @1
Add @2
然后将这个文件添加到工程中,
link中设置 /dll 然后编译
debugrelease中就可以找到dlllib
使用的时候加上dll.h文件

分享到:
评论

相关推荐

    Directx 11 lib and dll file

    在"Directx 11 lib and dll file"这个主题中,我们主要关注的是DirectX 11的库文件(lib)和动态链接库文件(dll)。 库文件(lib)在编程中主要用于静态链接,它们包含了编译好的函数和数据,当程序员在项目中引用这些...

    openssl_lib_and_dll_debug_release

    标题“openssl_lib_and_dll_debug_release”指向的是OpenSSL在Windows平台上的不同构建版本,包括静态库和动态库,以及它们的Debug和Release模式。 首先,让我们来理解OpenSSL的静态库(lib)和动态库(dll)。静态...

    so2lib实用工具(把cygwin生成的so或dll转换成vc可调用的lib)

    // so2lib.cpp : create a lib export table for vc by dll/so. ...// modify base at a project "CodeProject Create your Proxy DLLs ...// and resolve the problem of article 《MinGW 编译的DLL在VC中使用的问题》

    SOIL2_include_lib_dll.zip

    这个名为"SOIL2_include_lib_dll.zip"的压缩包包含了SOIL2库的不同版本和相关组件,以适应不同的开发需求。以下是对这些文件和知识点的详细解释: 1. **SOIL2库**:SOIL2(Simple and Fast Multimedia Library 2)...

    MFC42U.LIB和MFC42UD.LIB和DLL文件

    MFCO42UD.DLL、MFCD42UD.DLL和MFCN42UD.DLL是MFC的其他组成部分,分别对应OLE(Object Linking and Embedding)、数据库和网络支持的DLL文件。这些扩展DLL提供了MFC对特定功能的支持,例如,MFCO42UD.DLL包含了与OLE...

    opengl的库文件,lib文件,dll文件

    在Windows系统中,OpenGL通常需要库文件(.lib)、动态链接库文件(.dll)以及头文件(.h)来支持应用程序的开发。下面将详细介绍标题和描述中提及的几个关键库及其在OpenGL编程中的作用。 1. **GLEW (OpenGL ...

    openssl_lib_and_dll_debug_release_x86

    在“openssl_lib_and_dll_debug_release_x86”这个压缩包中,我们关注的是适用于x86架构的32位版本的OpenSSL库和动态链接库(DLL)文件,包括调试(Debug)和发布(Release)两个配置。 1. **OpenSSL 架构与版本**...

    tensorflow.lib and tensorflow.dll

    总之,`tensorflow.lib`和`tensorflow.dll`是TensorFlow在Windows x64环境下运行和开发的重要组成部分。静态库提供了编译时集成的功能,而动态库则负责运行时的调用。理解和正确使用这些库文件是成功集成和利用...

    dll2lib.rar (需要安装 python2.X )

    标题: How can an MSVC program call an MinGW DLL, and vice versa? 网址: http://wyw.dcweb.cn/dllfaq.htm ------------------- 下面是传说中价格为$999的 DLL to Lib (d2l) 它能把 dll 转为静态库 :) DLL to...

    vc dll和lib编写样例

    **DLL(动态链接库)与LIB(静态链接库)是Windows平台上常见的库文件类型,用于在不同程序之间共享代码和资源。本示例基于Visual Studio 2013,为初学者提供了创建和使用DLL及LIB的基本教程。** **DLL(动态链接库...

    LASZIP2.2.0 编译之后的 64位 +32位 LIB和DLL

    "LASZIP2.2.0 编译之后的 64位 +32位 LIB和DLL" 这个标题说明了资源的内容是LASZIP库的2.2.0版本,包含了适用于64位和32位系统的动态链接库(DLL)和静态链接库(LIB)。这些文件是经过编译后的产物,可以直接用于...

    proj.exe, proj.dll and proj.lib.

    在这个场景中,"proj.exe, proj.dll and proj.lib" 是三个关键组成部分,它们在Windows开发环境中扮演着重要角色。这些文件通常与一个名为"proj4"的项目或库相关,这可能是一个开源的地理坐标系统转换库。 首先,...

    OgreSdk包含Include和lib以及dll

    静态库(通常以.lib或.a结尾)在编译时会被链接到目标程序中,而动态库(通常是.dll或.so结尾)则在运行时被加载。开发者需要根据自己的项目需求选择使用哪种类型的库。 3. **dll目录**:这部分包含Ogre运行时所需...

    Iphlpapi.lib and Dnsapi.lib

    在Windows操作系统中,`Iphlpapi.lib`和`Dnsapi.lib`是两个非常重要的动态链接库(Dynamic Link Library, DLL),它们提供了大量的网络编程接口,帮助开发者处理IP网络层和DNS(Domain Name System)相关的操作。...

    傅里叶变换库函数FFTW

    Here are FFTW lib and dll files compiled by GCC4.5 and VC2010 in Win7. But I suggest you compiling it by youself in you computer, or there will be some unpredictable errors!

    psapi.dll psapi.lib psapi.h

    标题中的"psapi.dll psapi.lib psapi.h"涉及到的是Windows操作系统中的进程和服务API(Process and Service API)组件。这个组件主要提供了与进程和系统资源管理相关的函数接口,供开发者在编写应用程序时调用。 ...

    jsonLib支持库

    // getters and setters } ``` 你可以这样使用jsonLib: ```java Person person = new Person(); person.setName("John"); person.setAge(30); String jsonString = JsonUtil.toJson(person); System.out....

    libiconv.lib and iconv.h for win64

    编码转换的64包,我是在jni封装ctp时使用这个传中文可以不乱码 int code_convert(const char *from_charset, const char *to_charset, char *inbuf, size_t inlen, char *outbuf, size_t outlen) ...

    DLL To LIB 1.42 Retail

    DLL to Lib is a magical tool which can convert a DLL into its equivalent static library file. After that, you can replace the original DLL with the static library, rebuild your application, and ...

    ntstrsafe.lib and csq.lib.rar

    对于动态库(如dll文件),则需要确保运行环境能够找到相应的dll文件。 2. 头文件引用:在源代码中,需要包含对应的头文件,例如,使用NTStrSafe函数时,需要包含。 3. 错误处理:尽管NTStrSafe函数库提高了安全性...

Global site tag (gtag.js) - Google Analytics