windows环境DLL链接问题之一:dllimport是必须的吗?
2013-08-28 22:34
375 查看
最近看了Windows核心编程中关于DLL链接的章节,遇到很多很多问题(唉 本人比较笨拙),在此做个小小笔记,也希望能帮到同是程序猿的你们!!
核心编程第十九章讲述了DLL隐含链接的内容,本人完全按照书上敲进去的测试代码,无奈总是编译出错,并且大多是unresolved external symbol问题,于是追根究底,用了一天半的时间看了C/C++修饰符问题,最后才明白,大多问题也都出在这里!
废话不多说,代码就是我们最好的语言啦!下面是我的测试程序的例子,例子也是摘抄的,但是修改了大部分,用的vs2008的IDE:
首先是Dll测试头文件:DllCom.h
#include "stdafx.h"
#include
#ifdef __cplusplus
#define _DLLCOM_ extern "C" __declspec (dllexport)
#else
#define _DLLCOM_ __declspec (dllexport)
#endif
#include "DllCom.h"
//创建自己的共享节
#pragma data_seg("MyShared")
char m_strString[256]=__TEXT("hello world!");
volatile bool bInCriticalSection=FALSE;
#pragma data_seg()
//设置可执行的共享节数据操作
#pragma comment(linker,"/SECTION:MyShared,RWS")
CCriticalSection cs;
_DLLCOM_ LPSTR XX_XX GetValueString(int i)
{
#ifdef __cplusplus
printf("dll c++ definition!\n");
#else
printf("dll c++ not definition!\n");
#endif
while(bInCriticalSection) // 等待
Sleep(1);
return m_strString;
}
// 把字符串存储到共享内存中
_DLLCOM_ void XX_XX SetValueString(LPCSTR str)
{
while(bInCriticalSection) // 等待
Sleep(1);
cs.Lock();
bInCriticalSection = TRUE;
strcpy(m_strString,str);
bInCriticalSection = FALSE;
cs.Unlock();
} //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
DLL的测试文件就到这里啦!
代码中有些许注释,相信也能看的懂,回到我们的问题:dllimport是不是一直都是必须的呢?
答案是:不是!
这个例子就能够很好的编译成DllCom.dll和DllCom.lib文件(只要DLL中有输出的变量或者函数,就会生成lib文件)!
根据核心编程中的描述,当可执行程序链接到一个函数或者变量时,它会查找经过C/C++规则生成的相应函数的修饰符,查找修饰符的过程就分为隐式链接与显示加载。
隐式链接:这里就用到了lib文件,通过使用__declspec(dllimport)关键字, 编译器预先知道你要引用的符号将从一个DLL文件的.lib文件引入,就能生成运行效率稍高的代码。
显示加载:LIB和DLL的区别与使用
看到这里,相信大家已经知道dllimport关键字的作用了吧!O(∩_∩)O哈哈~
核心编程第十九章讲述了DLL隐含链接的内容,本人完全按照书上敲进去的测试代码,无奈总是编译出错,并且大多是unresolved external symbol问题,于是追根究底,用了一天半的时间看了C/C++修饰符问题,最后才明白,大多问题也都出在这里!
废话不多说,代码就是我们最好的语言啦!下面是我的测试程序的例子,例子也是摘抄的,但是修改了大部分,用的vs2008的IDE:
首先是Dll测试头文件:DllCom.h
#ifndef _DLLOBJ_H_INCLUDED #define _DLLOBJ_H_INCLUDED #include #ifdef _DLLCOM_ #else //两条下划线才对 #ifdef __cplusplus //#define _DLLCOM_ extern "C" __declspec(dllimport) #define _DLLCOM_ extern "C" __declspec (dllexport) #else //#define _DLLCOM_ __declspec(dllimport) #define _DLLCOM_ __declspec (dllexport) //#define _DLLCOM_ #endif #endif //#define XX_XX _stdcall #define XX_XX _cdecl _DLLCOM_ LPSTR XX_XX GetValueString(int i ); _DLLCOM_ void XX_XX SetValueString(LPCSTR str); #endif源代码文件:DllCom.cpp
#include "stdafx.h"
#include
#ifdef __cplusplus
#define _DLLCOM_ extern "C" __declspec (dllexport)
#else
#define _DLLCOM_ __declspec (dllexport)
#endif
#include "DllCom.h"
//创建自己的共享节
#pragma data_seg("MyShared")
char m_strString[256]=__TEXT("hello world!");
volatile bool bInCriticalSection=FALSE;
#pragma data_seg()
//设置可执行的共享节数据操作
#pragma comment(linker,"/SECTION:MyShared,RWS")
CCriticalSection cs;
_DLLCOM_ LPSTR XX_XX GetValueString(int i)
{
#ifdef __cplusplus
printf("dll c++ definition!\n");
#else
printf("dll c++ not definition!\n");
#endif
while(bInCriticalSection) // 等待
Sleep(1);
return m_strString;
}
// 把字符串存储到共享内存中
_DLLCOM_ void XX_XX SetValueString(LPCSTR str)
{
while(bInCriticalSection) // 等待
Sleep(1);
cs.Lock();
bInCriticalSection = TRUE;
strcpy(m_strString,str);
bInCriticalSection = FALSE;
cs.Unlock();
} //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
DLL的测试文件就到这里啦!
代码中有些许注释,相信也能看的懂,回到我们的问题:dllimport是不是一直都是必须的呢?
答案是:不是!
这个例子就能够很好的编译成DllCom.dll和DllCom.lib文件(只要DLL中有输出的变量或者函数,就会生成lib文件)!
根据核心编程中的描述,当可执行程序链接到一个函数或者变量时,它会查找经过C/C++规则生成的相应函数的修饰符,查找修饰符的过程就分为隐式链接与显示加载。
隐式链接:这里就用到了lib文件,通过使用__declspec(dllimport)关键字, 编译器预先知道你要引用的符号将从一个DLL文件的.lib文件引入,就能生成运行效率稍高的代码。
显示加载:LIB和DLL的区别与使用
看到这里,相信大家已经知道dllimport关键字的作用了吧!O(∩_∩)O哈哈~
相关文章推荐
- windows环境DLL链接问题之二:C/C++修饰符问题
- windows环境DLL链接问题之三:C/C++修饰符问题续
- windows下的动态链接问题(.dll文件的编写与调用)
- windows-VC++6.0环境下C++链接MySQL数据库
- 使用cygwin在windows上模拟unix环境,解决不能显示中文的问题
- Windows下搭建go语言开发环境 以及 开发IDE (附下载链接)
- 解决VC中动态加载DLL时,必须将DLL文件放在EXE文件路经和系统目录下的问题
- 在 Windows 下用 TDM-GCC(MinGW)开发 DLL 涉及到数据同步锁及 DLL 初始化终止化函数的问题
- 求解windows 环境和Linux环境postMethod请求参数不同的问题?!
- xp ghost 完后出现 windows root system32 hal.dll 问题的解决办法
- python MySQLdb在windows环境下的快速安装、问题解决方式
- 修复windows环境zookeeper服务器重启有可能会导致客户端CPU占用率100%的问题
- Windows下PCI9054驱动程序开发环境搭建及常见问题解决
- apicloud git-svn 地址冲突,导致代码管理功能不可用.这个问题是由 windows 系统自身DLL加载机制引起的.一般重启电脑即可解决
- 动态链接库中分配内存引起的问题-- windows已在XX.exe中触发一个断点
- 套用今天的签名“最新的VS+最新的MATLAB+最新的WINDOWS=无尽的烦恼 ”,用了一天的时间去配置相关的环境,确实很囧。好在现在问题解决了,特发布过程如下,希望能给有需要的朋友带来帮助。
- [置顶] 在windows上搭建React Native开发环境时遇到licence问题的解决
- windows中dll和linux中so的动态链接库的详解
- 不用ubuntu,不用mac。教你在windows环境下轻轻松松将android platform源码链接到eclipse
- nutch2.x在eclipse+windows环境下运行遇到的一些问题的解决方案