dll 导出函数

首先声明,我是一个vc的初学者,一直认为vc是一件很麻烦的事儿。

在今年3月份,突发奇想给自己找麻烦,学习vc编程,其实我到现在还没弄明白什么是c\c++\vc\vc++呢。

呵呵。

下边是我对 dll 导出函数的一点学习心得

初始,看了一篇博文:

http://blog.csdn.net/g710710/article/details/7255744

标题是:VS2010中 C++创建DLL图解真的

真的是图文并茂啊,看的我心痒痒的,就从网上搜索了vs2012下载回来安装上了,浪费了3个小时啊。

然后按照文章的步骤进行了项目的搭建,代码的编写。

但是在对cpp进行编译的时候出现了错误啊。。。。。。

提示我------

warning C4273: “Add”: dll 链接不一致

哎!!!!!!我发现vc真是不好学习啊。

然后就疯狂的度娘,为什么会出错呢?度娘的结果是-----:

方法1: 选择项目->属性->预处理器->预处理定义, 增加:HYCOMMONWINAPI_EXPORTS

方法2:

就是在

#ifdef HYCOMMONWINAPI_EXPORTS

#define HYCOMMONWINAPI_API __declspec(dllexport)

#else

#define HYCOMMONWINAPI_API __declspec(dllimport)

#endif

前面增加 #define HYCOMMONWINAPI_EXPORTS

其实这两种方法都是增加定义

方法3:在你的dll cpp文件中把

#define HYCOMMONWINAPI_EXPORTS

加在#include <接口文件.h>

的前面

方法4:右击dll工程 -- 属性,打开属性页,展开:配置属性 -- C++ --预处理器,在预处理器定义的最后面填入:_AFXEXT,再次编译则搞掂。

我按照上面的办法挨个实验啊。。。。。

还是出错!!!!!!(拜托,大神们,别总是转载别人的文章,自己试试啊!)

然后就开始自己猜测性分析了。

头文件代码:

#ifndef testDll_H_
	#define testDll_H_
	
	#ifdef MYLIBDLL
		#define MYLIBDLL extern "C" __declspec(dllimport)
	#else
		#define MYLIBDLL extern "C" __declspec(dllexport)
	#endif
	MYLIBDLL int Add(int plus1,int plus2);
#endif

//大神看到别笑我,我按照if的语法格式做了缩进,看起来舒服一些。

cpp文件代码:

#include "stdafx.h"
#include "testDll.h"
#include <iostream>
using namespace std;

int Add(int plus1,int plus2)
{
	int add_result = plus1 + plus2;
	return add_result;
}

def文件内容:

LIBRARY
EXPORTS
Add @1

 

(如上代码真心是按照 博文 一点点敲出来的啊)

在编译后就总是警告:warning C4273: “Add”: dll 链接不一致

没法子啊!!!

度娘没帮上忙,自己一点点的找错吧。

通过一番折腾后,我发现,我所搜索到的,解决C4273的结果,全XXXXXX(国骂一句)

我自己的结论是:

1、export __declspec(dllimport) 和def文件是不冲突的。

    当你在头文件中庸export声明了函数需要被导出,并且在def文件中一样存在导出add函数的声明,这两个是不冲突的;

    但是结果不一样:

       a、export声明导出的函数,似乎是不能使用别名的,切,不能指定在导出函数表中的ordinal(具体我对它的理解是,索引吧)

       b、def文件导出的函数,可以使用别名----这个我喜欢

 

2、我所看的文章的作者,其实多做了一步,就是同时声明了export和def

3、其实头文件没有那么麻烦,我自己更改了一下头文件,如下:

int Add(int plus1,int plus2);

   只有一个Add函数的定义

     def文件也修改了一下:

LIBRARY
EXPORTS
myAdd = Add  //myAdd是def文件中对于Add函数起的别名,这样在导出函数列表中就看不到Add了

  我给Add函数起了一个别名。

      然后再编译,没有任何错误了。哈哈,恭喜一下自己,总算迈出第一步了。

 

写这篇文章,就是想自己做一下笔记。看到错误的人,最好不要喷我,我真的是一个vc的初学者。

 

   

 

posted @ 2016-03-16 16:30  俺是个写程序的  阅读(573)  评论(0编辑  收藏  举报