Windows DLL,导出,模板和链接器问题

时间:2014-12-10 14:22:04

标签: c++ visual-studio templates dll declspec

我有一个问题。我有一个看起来像这样的类结构:

// Common.hpp

template <typename Type>
class CommonInternalRegistrar
{
    CommonInternalRegistrar ( Type* pointerToRegister ) ;
} ;
template <typename Type>
class DerivesFrom
:   public virtual Type
,   public CommonInternalRegistrar<Type>
{
    DerivesFrom ()
    :   CommonInternalRegistrar<Type> ( this )
    { }
} ;

class MyInterface
{
    virtual void doSomething () =0 ;
} ;


// CommonClass1.hpp

class DLL_FLAG MyCommonClass
:   public DerivesFrom<MyInterface>
{ } ;


// Class1.cpp in LibraryA.dll

namespace some_namespace {
    class DLL_FLAG_A MyClass
    :   public MyCommonClass
    { } ;
}


// Class2.cpp in LibraryB.dll

namespace some_namespace {
    class DLL_FLAG_B MyClass
    :   public DerivesFrom<MyInterface>
    { }
}

那些迂腐的人的一些笔记:

  • 我在公开场合松懈:在本例中可读性的课程

  • 在这个例子中,DerivesFrom做了一些有用的事情并不是很明显。但是,在我们的架构中,确实如此,您必须相信它是必要的。

  • DLL_FLAG是一个宏,在编译代码时

现在,问题是:

在LibraryA中,导出MyClass和MyCommonClass。由于导出了MyCommonClass,因此也会导出DerivesFrom(至少在VS2012中会出现这种情况)。

然后,当LibraryB导出MyClass时,它还会导出DerivesFrom(wtf?)。

然后,当我们将MyExecutable.exe(作为cmake定义的构建过程的一部分)与LibraryA.dll和LibraryB.dll链接时,它会失败,因为有一个重复的DerivesFrom - 来自每个库的一个。

我们之前见过并且无法使用的解决方案:

__ declspec(dllexport)DerivesFrom在一个库中导入并在另一个库中导入。但是,这需要代码中太多的废话,而这些代码实际上不应该存在。然后它强迫一个图书馆到主持人#34;这个概念在我们的系统中没有意义。

&#34;不要这样做。&#34;好吧,我说Visual Studio不应该这样做。或者我们应该能够指定DerivesFrom(以及DerivesFrom的所有实例化)只有内部链接,因此它的符号永远不会被导出。

我感到茫然:

  • 为什么VS2012会自动导出模板并拒绝让每个库使用自己的模板。

  • 为什么我不能告诉它永远不要导出这些模板(这可能不可行,因为有时候,两个库可能来自一个其中包含DerivesFrom&lt;&gt;的类。)

  • 如何解决此问题。

任何想法都将不胜感激!

0 个答案:

没有答案