链接器错误尝试从dll调用extern“C”函数

时间:2013-01-28 20:45:39

标签: c++ dll linker c++-cli

我正在尝试在C ++ / CLI .dll项目中使用本机.dll项目中的C ++类。 Visual Studio 2010,.NET Framework 3.5。到目前为止,这就是我所拥有的:

// This is a common macro:
#ifdef ISDLL
#define DLL __declspec(dllexport)
#else
#define DLL __declspec(dllimport)
#endif

NativeProject:
   //INativeType.h: 
   class DLL INativeType {
       public:
           virtual void Foo() = 0;
   };

    //NativeType.h: 
    class DLL NativeType : public INativeType {
        public:
            virtual void Foo(); 
    };

    extern "C" DLL INativeType CreateNativeType();

    //NativeType.cpp: 
    void NativeType::Foo() {} 
    extern "C" DLL INativeType* CreateNativeType() { 
        return new NativeType(); 
    }

C++/CLI Project:
    // Wrapper.h:
    #include "INativeType.h"
    ref class Wrapper {
        INativeType* m_nativeType;
    };

    // Wrapper.cpp:
    #include "Wrapper.h"
    #include "NativeType.h"
    // in some method:
        m_nativeType = CreateNativeType();

这给了我以下链接器错误:

error LNK2028: unresolved token (...) "extern "C" class INativeType * __stdcall CreateNativeType(void)"" ... in Wrapper.obj

此外,尽管在NativeProject.dll中正确导出了这些函数,但我使用DependencyWalker对其进行了验证,链接器也会发出此警告:

warning LNK4199: /DELAYLOAD:NativeProject.dll ignored; no imports found from NativeProject.dll

C ++ / CLI项目配置为延迟加载NativeProject.dll,并在其链接器选项中包含NativeProject.lib。此时我不知道如何诊断此链接器错误。我做错了什么?

1 个答案:

答案 0 :(得分:1)

为什么不让C ++ / CLI项目直接实例化该类而不是工厂方法呢?

除此之外,它看起来就像你正在重新发明COM(通过接口使用对象)。我只是实例化完整的C ++类,或者,如果你真的需要它,使用完整的COM。

编辑:确保工厂方法的调用约定在客户端和DLL中都相同。