- 浏览: 225418 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
synack:
写的很好,图文并茂,语言简单清晰,赞!
SkipList 跳表 -
king_c:
jiandandecaicai 写道你好,请教一下是如何通过E ...
从Hadoop URL 中读取数据 -
jiandandecaicai:
你好,请教一下是如何通过Eclipse来连接Hadop机群的, ...
从Hadoop URL 中读取数据
使用静态调用方式时,需要将在生成动态链接库时产生的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,char* argv[])
{
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文件,就必须: 如果你想从你的代码分离一个dll文件出来代替静态连接库,仍然需要一个lib文件。这个lib文件将被连接到程序告诉操作系统在运行的时候你想用 到什么dll文件,一般情况下,lib文件里有相应的dll文件的名字和一个指明dll输出函数入口的顺序表。如果不想用lib文件或者是没有lib文 件,可以用WIN32 API函数LoadLibrary、GetProcAddress。事实上,我们可以在Visual C++ IDE中以二进制形式打开lib文件,大多情况下会看到ASCII码格式的C++函数或一些重载操作的函数名字。 .h文件是在编译的时候才用到的 .lib文件是在链接的时候才用到的 .dll文件是在运行的时候才用到的 一般我们最主要的关于lib文件的麻烦就是出现unresolved symble 这类错误,这就是lib文件连接错误或者没有包含.c、.cpp文件到工程里,关键是如果在C++工程里用了C语言写的lib文件,就必需要这样包含: extern "C" 这是因为C语言写的lib文件没有C++所必须的名字破坏,C函数不能被重载,因此连接器会出错。 =============================== 在VC中不用MFC如何制作dll 方法一:使用export 和 import 在VC中建立一个Console Application,建立2个文件:Dll.h 和 Dll.cpp Dll.h #ifdef MYLIBAPI MYLIBAPI int Add (int iLeft, int iRight) ; Dll.cpp #define MYLIBAPI extern "C" _declspec (dllexport) #include "Dll.h" int Add (int iLeft, int iRight) int Sub (int iLeft, int iRight) 保存文件。 方法二:使用def文件 Dll.h int Add (int iLeft, int iRight) ; Dll.cpp #include "Dll.h" int Add (int iLeft, int iRight) int Sub (int iLeft, int iRight) 然后再当前目录下面建立一个.def文件,文件名最好和要输出的dll名字一样,扩展名 LIBRARY dllname.dll
1 包含一个对应的头文件告知编译器lib文件里面的具体内容
2 设置lib文件允许编译器去查找已经编译好的二进制代码
{
#include "myheader.h"
}
#else
#define MYLIBAPI extern "C" _declspec (dllimport)
#end if
MYLIBAPI int Sub (int iLeft, int iRight) ;
{
return iLeft + iRight ;
}
{
return iLeft - iRight ;
}
在Project->setting->link 最下面加上 “/dll”, "/"之前一定要与前一项
有空格。
然后编译,就可以在debug 或 release下面找到dll 和 lib 文件了
使用的时候包含dll.h文件
建立一个console application, 建立2个文件dll.h 和 dll.cpp
int Sub (int iLeft, int iRight) ;
{
return iLeft + iRight ;
}
{
return iLeft - iRight ;
}
为.def, 里面写上:
EXPORTS
Add @1
Add @2
然后将这个文件添加到工程中,
在link中设置 /dll, 然后编译
在debug或release中就可以找到dll和lib了
使用的时候加上dll.h文件
发表评论
-
c++引用计数的本质
2015-03-24 14:26 1389为什么要用引用计数? 场景:代码里X是一个 ... -
COM 数组传输-使用VARIANT传递数组的方法及步骤 .
2015-02-16 17:22 21在使用COM/DCOM写组件时经常要传递数组,一般比如SHO ... -
MFC程序中打印调试信息
2015-01-20 22:11 11511、在要打印调试的类中加上头文件 #include ... -
opencv轮廓提取与轮廓拟合
2015-01-05 09:55 2116#include <iostream> #i ... -
c语言操作二进制文件fopen中fseek的注意事项
2014-11-22 01:04 1270今天在使用fopen的时候,遇到了fseek(fp,0 ... -
C++中delete和delete[]的区别
2014-11-21 23:41 731一直对C++中的delete和delete[]的区别不甚 ... -
缺少streams.h的解决方法
2014-10-09 17:19 1117这几天在学DirectShow的开发,一个streams. ... -
使用ATL创建进程外组件
2014-03-24 22:39 1242一、建立一个进程外组件1)打开菜单File|New,选择Pr ... -
vector 转换成 数组 - [C++]
2013-12-13 18:06 4737参考: http://topic.csdn.n ... -
ref:Windows 上静态编译 Libevent 2.0.10 并实现一个简单 HTTP 服务器
2013-09-09 00:21 852原文地址:http://www.s135.com ... -
openMP
2013-06-08 23:32 1001最近在看多核编程。简单来说,由于现在电脑CPU一般都有两 ... -
nafxcw.lib与LIBCMT.lib在vs2008中链接冲突解决方案
2013-05-09 09:51 10691>正在链接...1>nafxcw.lib(af ... -
Errore HTTP 404.2 - Not Found" IIS 7.5 请求的内容似乎是脚本,因而将无法由静态文件处理程序来处理
2012-11-20 17:46 991如题,这个错误google时一大堆各种各样的解决办法,但 ... -
JAVA中的数据存储(堆及堆栈)
2012-11-06 21:40 1098在JAVA中,有六个不 ... -
error : Please use the /MD switch for _AFXDLL builds 的解决方法
2012-09-20 21:14 2773在用vs打开项目后,编译的时候出现“Please use ... -
共享内存的例子(转msdn)
2012-06-02 19:18 1501Creating Named Shared Memo ... -
使用Signature Tool自动生成P/Invoke调用Windows API的C#函数声明
2012-03-17 22:47 1290在网上看到很多网友在.NET程序中调用Win32 API, ... -
c语言内存分配 2
2012-02-21 18:00 924二、栈(stack)和堆(heap)具体的区别。 ... -
(转)关于栈、堆、静态存储区最大可分配大小的探讨 --海量之一
2012-02-20 21:56 1800中午看《编程之美》的第2.5节中有这么一小段程序: floa ... -
向上取整
2012-02-12 16:30 1364假设变量x和n ...
相关推荐
在"Directx 11 lib and dll file"这个主题中,我们主要关注的是DirectX 11的库文件(lib)和动态链接库文件(dll)。 库文件(lib)在编程中主要用于静态链接,它们包含了编译好的函数和数据,当程序员在项目中引用这些...
标题“openssl_lib_and_dll_debug_release”指向的是OpenSSL在Windows平台上的不同构建版本,包括静态库和动态库,以及它们的Debug和Release模式。 首先,让我们来理解OpenSSL的静态库(lib)和动态库(dll)。静态...
// 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库的不同版本和相关组件,以适应不同的开发需求。以下是对这些文件和知识点的详细解释: 1. **SOIL2库**:SOIL2(Simple and Fast Multimedia Library 2)...
MFCO42UD.DLL、MFCD42UD.DLL和MFCN42UD.DLL是MFC的其他组成部分,分别对应OLE(Object Linking and Embedding)、数据库和网络支持的DLL文件。这些扩展DLL提供了MFC对特定功能的支持,例如,MFCO42UD.DLL包含了与OLE...
在Windows系统中,OpenGL通常需要库文件(.lib)、动态链接库文件(.dll)以及头文件(.h)来支持应用程序的开发。下面将详细介绍标题和描述中提及的几个关键库及其在OpenGL编程中的作用。 1. **GLEW (OpenGL ...
在“openssl_lib_and_dll_debug_release_x86”这个压缩包中,我们关注的是适用于x86架构的32位版本的OpenSSL库和动态链接库(DLL)文件,包括调试(Debug)和发布(Release)两个配置。 1. **OpenSSL 架构与版本**...
总之,`tensorflow.lib`和`tensorflow.dll`是TensorFlow在Windows x64环境下运行和开发的重要组成部分。静态库提供了编译时集成的功能,而动态库则负责运行时的调用。理解和正确使用这些库文件是成功集成和利用...
标题: 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...
**DLL(动态链接库)与LIB(静态链接库)是Windows平台上常见的库文件类型,用于在不同程序之间共享代码和资源。本示例基于Visual Studio 2013,为初学者提供了创建和使用DLL及LIB的基本教程。** **DLL(动态链接库...
"LASZIP2.2.0 编译之后的 64位 +32位 LIB和DLL" 这个标题说明了资源的内容是LASZIP库的2.2.0版本,包含了适用于64位和32位系统的动态链接库(DLL)和静态链接库(LIB)。这些文件是经过编译后的产物,可以直接用于...
在这个场景中,"proj.exe, proj.dll and proj.lib" 是三个关键组成部分,它们在Windows开发环境中扮演着重要角色。这些文件通常与一个名为"proj4"的项目或库相关,这可能是一个开源的地理坐标系统转换库。 首先,...
静态库(通常以.lib或.a结尾)在编译时会被链接到目标程序中,而动态库(通常是.dll或.so结尾)则在运行时被加载。开发者需要根据自己的项目需求选择使用哪种类型的库。 3. **dll目录**:这部分包含Ogre运行时所需...
在Windows操作系统中,`Iphlpapi.lib`和`Dnsapi.lib`是两个非常重要的动态链接库(Dynamic Link Library, DLL),它们提供了大量的网络编程接口,帮助开发者处理IP网络层和DNS(Domain Name System)相关的操作。...
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"涉及到的是Windows操作系统中的进程和服务API(Process and Service API)组件。这个组件主要提供了与进程和系统资源管理相关的函数接口,供开发者在编写应用程序时调用。 ...
// getters and setters } ``` 你可以这样使用jsonLib: ```java Person person = new Person(); person.setName("John"); person.setAge(30); String jsonString = JsonUtil.toJson(person); System.out....
编码转换的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 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 ...
对于动态库(如dll文件),则需要确保运行环境能够找到相应的dll文件。 2. 头文件引用:在源代码中,需要包含对应的头文件,例如,使用NTStrSafe函数时,需要包含。 3. 错误处理:尽管NTStrSafe函数库提高了安全性...