dllexport和dllimport使用的问题

nice9699 2011-10-27 10:21:02
最近在修改一个程序,结构是这样的:
程序包括三个部分:动态链接库Lib1, 动态链接库Lib2, 主程序Prog1。其中Lib2需要用到Lib1,Prog1需要用到Lib1和Lib2。

现在需要把Lib1和Lib2改成静态链接库,让Prog1直接调用Lib1和Lib2。

其中Lib1中使用了以下宏,并且在很多类或函数前使用了宏EXPORT_LIB1:
#if defined DLL_EXPORT_LIB1
#define EXPORT_LIB1 __declspec(dllexport)
#else
#define EXPORT_LIB1 __declspec(dllimport)
#endif

Lib2中使用了以下宏,并且在很多类或函数前使用了宏EXPORT_LIB2:
#if defined DLL_EXPORT_LIB2
#define EXPORT_LIB2 __declspec(dllexport)
#else
#if defined DLL_EXPORT_LIB2_PROG
#define EXPORT_LIB2 __declspec(dllimport)
#else
#define EXPORT_LIB2
#endif
#endif

现在想把Lib1和Lib2编译成为静态Lib,请问:
1. 想要生成静态LIB,需要把这两个动态链接库项目的dllmain函数删除吗?
2. 编译时是否只需要把编译器中预定义的宏DLL_EXPORT_LIB1和DLL_EXPORT_LIB2去除,这样程序就不会以dllexport方式将函数输出?
3. 如果把编译器中预定义的宏DLL_EXPORT_LIB1和DLL_EXPORT_LIB2去除,dllimport起什么作用?需不需要将dllimport注释掉?
4. dllimport是不是可有可无?也就是#define EXPORT_LIB2 __declspec(dllimport)可以直接写成#define EXPORT_LIB2 吗?
5. 根据Lib2中对宏DLL_EXPORT_LIB2_PROG的定义,在编译程序Prog1时,编译器中加入宏DLL_EXPORT_LIB2_PROG和不加这个宏,结果会有什么不同?

谢谢各位高手!
...全文
163 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuucyf 2011-10-28
  • 打赏
  • 举报
回复
[Quote=引用楼主 nice9699 的回复:]
现在想把Lib1和Lib2编译成为静态Lib,请问:
1. 想要生成静态LIB,需要把这两个动态链接库项目的dllmain函数删除吗?
2. 编译时是否只需要把编译器中预定义的宏DLL_EXPORT_LIB1和DLL_EXPORT_LIB2去除,这样程序就不会以dllexport方式将函数输出?
3. 如果把编译器中预定义的宏DLL_EXPORT_LIB1和DLL_EXPORT_LIB2去除,dllimport起什么作用?需不需要将dllimport注释掉?
4. dllimport是不是可有可无?也就是#define EXPORT_LIB2 __declspec(dllimport)可以直接写成#define EXPORT_LIB2 吗?
5. 根据Lib2中对宏DLL_EXPORT_LIB2_PROG的定义,在编译程序Prog1时,编译器中加入宏DLL_EXPORT_LIB2_PROG和不加这个宏,结果会有什么不同?
[/Quote]
=>1. 是的,你要编译成静态库,那么原来的DLL工程跟你现在要编译的工程已经不同了,建议新建一个Lib工程,然后把你需要的.cpp, .h加到你新的工程中.

=>2.不能这么说,因为你现在是要编译成Lib的方式,所以没有所谓的Export函数,只要是Lib中全局变量或者函数你只要在你的程序中Link进去,并Include相应的Head File,那么你就可以直接使用.

=>3.需要,因为你已经不需要它了,可以全部删除掉.

=>4.不是,对DLL工程来说,如果写成你那样就不能Import了,这涉及到Exprot Section和Import Section的生成和使用.

=>5. 一个是Import和没有Improt的区别,楼主你可以仔细看下你前面的那段预编译代码.

建议楼主看看<<Window核心编程>>中的第19及后面的章节,专门介绍动态库的,从简单一直到高级技术。
96掌门师兄 2011-10-28
  • 打赏
  • 举报
回复
lib不需要加__declspec(dllexport) 的,直接在.h中声明函数就可以了。
jyh_baoding 2011-10-28
  • 打赏
  • 举报
回复
动态库的本身和被调用是的访问方式定义

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧