gpt4 book ai didi

c++ - 实现一个尚未编译的接口(interface),.cpp include?

转载 作者:行者123 更新时间:2023-11-28 07:54:27 25 4
gpt4 key购买 nike

我正在使用 VS2010,我正在设计一个 MVC 应用程序。

假设我在解决方案中有“项目 1”和“项目 2”。需要按顺序编译,P1编译成DLL,P2编译成动态使用DLL的Exe文件。 P2 声明了一个 View 界面。这两个项目都有一个实现接口(interface)的 View 类(一个具有纯虚方法的类)。

现在的问题是,我不能在 P1 中包含接口(interface)的头文件,因为链接器会说他无法解析这个外部符号。这当然是对的,因为它是稍后在 P2 中编译的。

所以我所做的是,我将 P2 的包含文件夹添加到 P1,并在 P1 中包含了 interface.cpp 而不是头文件。

它有效,但我认为这不是我应该做的。或者不是吗?界面明显编译了两次,每个项目编译一次。

不想把界面移到P1,有什么办法解决。假设,我不想要那个。

感谢输入。

编辑:代码片段:

Project1:

View1.hpp // nothing special

View1.cpp:

#include ViewInterface.cpp
View1::View1(int x) : ViewInterface(int x)

Project2:

ViewInterface.hpp:

#ifdef EXP
#define DECLDIR __declspec(dllexport)
#else
#define DECLDIR __declspec(dllimport)
#endif

class ViewInterface : SomeOtherClass, AnotherClass
{
virtual void DECLDIR show(void) const = 0;
virtual void DECLDIR hide(void) const = 0;
}

ViewInterface.cpp:

ViewInterface::ViewInterface(int x) : SomeOtherClass(int x), AnotherClass(int x)

View2.hpp // nothing special

View2.cpp:
#define EXP
#include ViewInterface.h

View2::View2(int x) : ViewInterface(int x)

最佳答案

为了使可执行文件能够使用 DLL 中的类,您需要确保它们已正确导出。编译 DLL 时,用 __declspec(dllexport) 标记该类,并且当您编译可执行文件时,您改为使用 __declspec(dllimport) 标记该类。通常这是使用这样的宏完成的:

// In your DLL's header file
#ifdef COMPILING_MY_DLL
#define MY_EXPORT __declspec(dllexport)
#else
#define MY_EXPORT __declspec(dllimport)
#endif

class MY_EXPORT MyClass
{
...
};

然后,在您的 DLL 项目中,定义宏 COMPILING_MY_DLL

关于c++ - 实现一个尚未编译的接口(interface),.cpp include?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13057893/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com