看"C++动态链接库编程深入浅出"的一些笔录
来自于百度文库http://wenku.baidu.com/view/2ab4b3c5bb4cf7ec4afed08c.html?from_page=view&from_mod=download
这篇文章我已下载,想要的朋友要联系我。
DLL的目的是共享代码,而我想做的,把要花很多精力实现的功能封装成DLL,方便自己,如果能方便别人,最好不过了。
1、为了头文件不被多次包含,用ifndef define endif形式,而不要用pragma once形式。
2、头文件是两面性的,在DLL项目里,他所声明的函数都是extern "C" _declspec(dllexport)的,而当头文件被包含在调用者项目的时候,他所声明的函数是extern "C" _declspec(dllimport)的。为了让头文件具有两面性,用宏控制,例子如下:
#ifndef _TESTDLL_H_H #define _TESTDLL_H_H #endif #ifdef TEST1_EXPORTS #define FUNPORT extern "C" _declspec(dllexport) #else #define FUNPORT extern "C" _declspec(dllimport) #endif FUNPORT int Fun_Add( int, int );
在这里要注意了,TEST1_EXPORTS宏定义在DLL的项目属性页//C/C++//预处理器//预处理器定义,里定义。
3、DLL项目里的编译链接成功后,会生成LIB和DLL文件。如果这个时候,把LIB删掉,代码没改动下,重新生成,LIB是不会重新生成的。
4、为了支持DLL项目里能断点调试,DLL项目里的LIB、DLL和调用者所使用的LIB、DLL必须完全相同(有时按网上的说法正确设置也不能断点调试),否则在运行的时候,断点处提示"当前不会命中断点,还没有为该文档加载任何符号"。为了解决这问题,可以<清除>再<重新生成>LIB和DLL,之后复制LIB和DLL到调用者项目里,调用者项目也要<清除>再<重新生成>EXE。