在vs2008中用c++做一个项目。 项目做到一半,希望把在vs中的一个项目分成两个,其中一个项目A包含公用的类,另一个项目B主要负责界面交互方面的工作。
这样的好处是:项目A的类可以被其他的项目(比如项目C, 项目D)重用。 目前只考虑代码级的重用,不考虑部署的问题。项目B毫无疑问应该是Application(.exe)类的项目。
但项目A呢?应该是 设置成 static library(.lib)的类型, 还是设置成 dynamic library (.dll)的类型更好些呢?如果项目A是dynamic library(dll)的类型。 我需要修改原来所有的已经写好的类的头文件,每个方法都加上__declspec(dllexport) 的修饰。 或者是def文件。如果项目A 是static library(lib)的类型。 在Build项目A的时候,由于只编译,并不做link,很多原来在link时可以检测到的一些问题(比如没有引入某个系统的lib),现在build 项目A的时候通通都没有问题了。 只有在对整个solution来bulid的时候才能发现这些问题, 感觉也不爽。这种情况大家推荐那种方案? 又没有其他更好的项目分离和代码复用的方法?
谢谢了。
这样的好处是:项目A的类可以被其他的项目(比如项目C, 项目D)重用。 目前只考虑代码级的重用,不考虑部署的问题。项目B毫无疑问应该是Application(.exe)类的项目。
但项目A呢?应该是 设置成 static library(.lib)的类型, 还是设置成 dynamic library (.dll)的类型更好些呢?如果项目A是dynamic library(dll)的类型。 我需要修改原来所有的已经写好的类的头文件,每个方法都加上__declspec(dllexport) 的修饰。 或者是def文件。如果项目A 是static library(lib)的类型。 在Build项目A的时候,由于只编译,并不做link,很多原来在link时可以检测到的一些问题(比如没有引入某个系统的lib),现在build 项目A的时候通通都没有问题了。 只有在对整个solution来bulid的时候才能发现这些问题, 感觉也不爽。这种情况大家推荐那种方案? 又没有其他更好的项目分离和代码复用的方法?
谢谢了。
class AFX_EXT_CLASS 类名非常简单,使用起来还和没分成两个项目一样。
接口层调用数据层的DLL,取出其中的各个方法返回的值,在你的应用程序中调用接口层
说的没错,我们公司这种情况都是做成mfc扩展类型的dll,可以导出由mfc标准类派生出的子类。
b项目调用可以用隐式导入的方式:在stdafx.h里加上#pragma comment(lib, "yourname.lib"),
并且编译b项目时需要声明a.dll导出类的那些头文件,这样从代码上讲跟合在一起的一个项目没多大区别,b.exe启动时就要加载a.dll。
另一种显示的导入方式不需要b项目包含相关头文件,a只要定义def文件即可,这种方式可支持在程序运行过程中,需要a.dll里的功能时才加载dll(通过AfxLoadLibrary()),但这种方式是与c兼容的,只能导出api函数,不能导出类。
故一般使用第一种方式,即隐式的导入。对于导出类的声明,可以用预编译指令定义一个宏,例如:#ifdef A_DLL
define A_DLL_EXPORT __declspec(dllexport)
#else
define A_DLL_EXPORT __declspec(dllimport)
#endif然后用class A_DLL_EXPORT 类名的形式声明要导出的类即可。这样通过条件预编译的技巧,a项目和b项目就可使用同一个头文件了。a项目的project setting里要设置预编译宏:A_DLL
如果不用mfc, 则可用标准dll项目来建立a.dll,这样其扩展性和灵活性都很强,a.dll的客户程序可以是非c++写的,更不要说mfc的限制了。而导入方式,显示的和隐式的导入都可,看需要而定,也可组合使用。
还是使用静态lib 不会牵涉到这么多隐藏问题。只需要跟exe统一编译选项。