代码之家  ›  专栏  ›  技术社区  ›  Nailer

从dll导入显式实例化的模板类

  •  7
  • Nailer  · 技术社区  · 16 年前

    作为一个动态链接库的新手,我必须向全能者询问一些事情。

    假设我显式地实例化这样的模板类:

    template class __declspec(dllexport) B<int>;
    

    如何再次使用导入此模板类?

    我已经尝试在我的.cpp文件中添加下面的代码,我想在其中使用b

    template class __declspec(dllimport) B<int>;
    
    2 回复  |  直到 15 年前
        1
  •  5
  •   dirkgently    16 年前

    当您完全实例化一个模板时——您有一个完整的类型。它与任何其他类型都没有区别。您需要包含的标题 B 以及编译时链接 lib 文件或动态加载dll以链接到定义。

    你读过这篇文章吗: http://support.microsoft.com/kb/168958 ?

    以下是我测试的内容(它起作用)的简要总结:


    创建虚拟dll项目

    • 使用Win32控制台应用程序向导生成dll头文件/源文件,名为: template_export_test
    • 添加了以下内容:

    文件: template_export_test.h


    #ifndef EXP_STL
    #define EXP_STL
    #endif 
    
    #ifdef EXP_STL
    #    define DECLSPECIFIER __declspec(dllexport)
    #    define EXPIMP_TEMPLATE
    #else
    #    define DECLSPECIFIER __declspec(dllimport)
    #    define EXPIMP_TEMPLATE extern
    #endif
    
    EXPIMP_TEMPLATE template class DECLSPECIFIER CdllTest<int>;
    

    文件: template_export_test.cpp


    template<class T>
    CdllTest<T>::CdllTest(T t)
    : _t(t)
    {
        std::cout << _t << ": init\n";
    }
    

    创建测试应用程序

    • 使用向导创建一个名为: driver
    • 编辑此项目的链接器项目设置:
      • 添加到链接器>常规>其他库目录:路径 template_export_test.lib
      • 添加到链接器>输入>其他依赖项: 模板_export_test.lib
    • 包括 模板导出测试.h 在主cpp文件中

    #include "c:\Documents and Settings\...\template_export_test.h"
    using namespace std;
    
    int main(int argc, char** argv) {
        CdllTest<int> c(12);
    }
    

    • 编译并运行!
        2
  •  0
  •   mats    15 年前

    似乎,即使模板有明确的安装,也可能出现导致运行时错误的问题。 看一看 this interesting article to C4251 (尤其是“结论”)。