最近在修改一个程序,结构是这样的:
程序包括三个部分:动态链接库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) 
#endifLib2中使用了以下宏,并且在很多类或函数前使用了宏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和不加这个宏,结果会有什么不同?谢谢各位高手!

解决方案 »

  1.   

    lib不需要加__declspec(dllexport) 的,直接在.h中声明函数就可以了。
      

  2.   

    =>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及后面的章节,专门介绍动态库的,从简单一直到高级技术。