Thursday, April 14, 2011

Importing explicitly instantiated template class from dll.

Being a dll newbie I have to ask the allmighty SO about something.

Say I explicitly instantiate a template class like this:

template class __declspec(dllexport) B<int>;

How do I use import this templated class again?

I've tried the adding the code below in my .cpp file where I want to use B

template class __declspec(dllimport) B<int>;
From stackoverflow
  • When you instantiate a template fully -- you have a complete type. It is no different from any other types. You need to include the header for B and also compile-time linking in with a lib file or dynamically load the dll to link to the definition.

    Have you read this article: http://support.microsoft.com/kb/168958 ?

    Here's a brief summary of what I tested (and it worked):


    Create a dummy DLL project

    • Used the Win32 Console application wizard to generate the dll header/source files called: template_export_test
    • Added the following:

    file: 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>;
    


    file: template_export_test.cpp


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


    Create the test application

    • Use the wizard to create a Win32 Console application called: driver
    • Edit the Linker project settings of this project:
      • Add to Linker > General > Additional Library Directories: path to template_export_test.lib
      • Add to Linker > Input > Additional Dependencies: template_export_test.lib
    • Include the template_export_test.h in the main cpp file


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


    • Compile and go!
    Nailer : I've tried : extern template class __declspec(dllimport) B; Didn't work.
  • It seems, even with explicit instatiation of the template, problems may arise that lead to run-time errors. Take a look at this interesting article to C4251 (especially the "Conclusion").

0 comments:

Post a Comment