在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的时候才能发现这些问题, 感觉也不爽。这种情况大家推荐那种方案? 又没有其他更好的项目分离和代码复用的方法?
谢谢了。

解决方案 »

  1.   

    要是类的话,还是static lib吧。要和exe统一编译选项。
      

  2.   

    DLL比较好。使用MFC扩展类,项目A分离出来以后。在需要导出的类加上:
    class AFX_EXT_CLASS 类名非常简单,使用起来还和没分成两个项目一样。
      

  3.   

    MFC扩展DLL可扩展性和通用性不强
      

  4.   

    这个项目不使用mfc,只使用stl和SDK, 所以可以排除MFC扩展DLL
      

  5.   

    代码复用并不是问题,我还是推荐用动态的DLL
      

  6.   

    我同意1楼的,如果只是类库,而不是一个独立的功能模块,而在exe中多处用到类库中的类或者函数。我个人建议用lib。
      

  7.   

    分层。分成数据层,接口转换层。都用DLL。
    接口层调用数据层的DLL,取出其中的各个方法返回的值,在你的应用程序中调用接口层
      

  8.   


    说的没错,我们公司这种情况都是做成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
      

  9.   


    如果不用mfc, 则可用标准dll项目来建立a.dll,这样其扩展性和灵活性都很强,a.dll的客户程序可以是非c++写的,更不要说mfc的限制了。而导入方式,显示的和隐式的导入都可,看需要而定,也可组合使用。
      

  10.   

    dll的话导出函数最好不要牵涉到类,不然问题多多。水太深,隐藏问题多。
    还是使用静态lib 不会牵涉到这么多隐藏问题。只需要跟exe统一编译选项。
      

  11.   

    dll比较好,当然,还得看你工程里面使用的方便情况。
      

  12.   

    如果用同一种语言开发, DLL的好处在那里?