首先声明,我是一个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的初学者。
原文:http://www.cnblogs.com/ymblog/p/5284042.html