如何使用C+导出多个类+/本机C++;图书馆 我有一个本地C++库(我们称之为CORILB.DLL),它公开了两个类: 核心.h 原子h

如何使用C+导出多个类+/本机C++;图书馆 我有一个本地C++库(我们称之为CORILB.DLL),它公开了两个类: 核心.h 原子h,c++,export,wrapper,command-line-interface,C++,Export,Wrapper,Command Line Interface,我有一个CLI/C++包装器(我们称之为CoreWrapper.dll),它允许.NET项目实例化Core和Atom对象: CoreDotNet.h AtomDotNet.h(包括Atom.h和CoreDotNet.h) 当我编译CoreWrapper时,只有CoreDotNet.h被编译,而AtomDotNet.h被忽略。如果我想编译AtomDotNet.h,那么我必须将其包含在CoreDotNet.h中,但这会导致CoreDotNet.h中出现编译器错误: error C2011: 'C

我有一个CLI/C++包装器(我们称之为CoreWrapper.dll),它允许.NET项目实例化
Core
Atom
对象:

  • CoreDotNet.h
  • AtomDotNet.h(包括Atom.h和CoreDotNet.h)
当我编译CoreWrapper时,只有
CoreDotNet.h
被编译,而
AtomDotNet.h
被忽略。如果我想编译
AtomDotNet.h
,那么我必须将其包含在
CoreDotNet.h
中,但这会导致
CoreDotNet.h
中出现编译器错误:

error C2011: 'CoreWrapperNS::CoreDotNet' : 'class' type redefinition
下面是一些表示我所做工作的基本代码:

#pragma once // <-- should protect from class type redefinition
#include "Core.h"
//#include "AtomDotNet.h" // uncommenting causes compiler error C2011

using namespace CoreNS;

namespace CoreWrapperNS
{
    public ref class CoreDotNet
    {
    public:
        // Allows users to instantiate a core object
        CoreDotNet();
        CoreDotnet(Core* core);
        //... destructor follows
    };
}

#pragma once/C++/CLI没有头文件的概念。头文件中的声明就是它的实现。因此,在“AtomDotNet.h”中包含“CoreDotNet.h”是一个问题

如果您的CoreDotNet.cpp仅包含:

#include "CoreDotNet.h"
和“AtomDotNet.h”的类似模式,然后从“AtomDotNet.h”中删除“CoreDotNet.h”include,您应该能够编译它


您需要像对待C#项目和相关类/*.cs文件一样对待C++/CLI。

仅在头文件中编写代码不会导致它包含在项目中


您需要将.cpp文件添加到项目中,并包含头。

要在同一项目中使用另一个.CPP文件中定义的托管类,请对CoreDotNet.CPP中的obj文件使用“#using”(类似于#include),如下所示:

#using "AtomDotNet.obj"
此外,在CoreDotNet.cpp属性页面或项目属性中,在C/C++下的“使用参考添加“$(IntDir)”路径中,以便在编译时可以找到文件


这是C++/CLI方式,没有更多的DLL地狱,也没有更多的.h地狱

别客气。我曾经看到过#pragma。@Ben Voigt现在我没有DotNet包装器库的.cpp文件。。。头文件是本地C++库周围的薄包装,所以它们只具有调用构造函数中实例化的本机对象的相应函数的内联函数。@ LILIK:编译器只编译它们。听起来缺少.cpp文件是你问题的一部分。@Ben Voigt,这就是问题所在。。。我添加了CPP文件,现在一切正常@Ben Voigt,请将评论作为答案发布,这样我就可以接受了;此外,编译器如何知道编译AtomDotNet(现在它只编译CoreDotNet,如果我没有在CoreDotNet头中包含“AtomDotNet.h”),完全错误。C++/CLI不仅能理解头文件,而且需要它们(好吧,或者将所有代码放在一个庞大的文件中,这是绝对不推荐的)。C#允许您引用在同一项目的另一个文件中定义的类型。对于C++/CLI,这是不可能的,您必须将声明包含到当前编译单元中。
#using "AtomDotNet.obj"