使用我自己的 dll 中的 class 时出现不完整类型错误

Incomplete type error while using class from my own dll

又是一天,关于Whosebug的一个愚蠢的问题,请原谅。 我的想法是制作 dll,然后将其导入另一个项目以在那里使用它,但是在第二个项目中包含 dll 头文件并写入 .lib 和头文件的路径后,我仍然有这些错误:

E0070   incomplete type is not allowed  prjct-1 D:\projects-vs\firstTryWT\prjct-1\prjct-1.cpp   33
C2027   use of undefined type 'stmr::MathProblem'   prjct-1 D:\projects-vs\firstTryWT\prjct-1\prjct-1.cpp   33
C2079   'problem' uses undefined class 'stmr::MathProblem'  prjct-1 D:\projects-vs\firstTryWT\prjct-1\prjct-1.cpp   33  
C3493   'problem' cannot be implicitly captured because no default capture mode has been specified  prjct-1 D:\projects-vs\firstTryWT\prjct-1\prjct-1.cpp   35  

我已经尝试重建,更改一些代码,直到我明白我已经做了需要的事情或者我不知道需要什么。无论如何,这是代码:

Dll 头文件:

#pragma once

#ifdef STMR_EXPORTS
#define STMR_API __declspec(dllexport)
#else
#define STMR_API __declspec(dllimport)
#endif

#include <vector>
#include <string>

namespace stmr
{
    class STMR_API MathProblem;
    class STMR_API Operation;
}

两个 类 的定义都有 STMR_API 关键字。我在 C/C++ -> 预处理器中有 'STMR_EXPORTS',在链接器 -> 高级 -> 导入库中有 '$(OutDir)$(TargetName).lib',这样我就生成了导入库。

应该使用 dll 的项目的主要 cpp:

#include <Wt/WApplication.h>
#include <Wt/WBreak.h>
#include <Wt/WContainerWidget.h>
#include <Wt/WLineEdit.h>
#include <Wt/WPushButton.h>
#include <Wt/WText.h>

#include "stmrLib.h"


class HelloApplication : public Wt::WApplication
{
public:
    HelloApplication(const Wt::WEnvironment& env);

private:
    Wt::WPushButton* button_m;
    Wt::WText* summary_m;
};

HelloApplication::HelloApplication(const Wt::WEnvironment& env)
    : Wt::WApplication(env)
{
    button_m = root()->addWidget(std::make_unique<Wt::WPushButton>());
    summary_m = root()->addWidget(std::make_unique<Wt::WText>()); 
    stmr::MathProblem problem = stmr::MathProblem(problemText_m->text().narrow());
    auto solving = [this] {   
        summary_m->setText("This equals " + std::to_string(problem.solve()));
    };
    button_m->clicked().connect(solving);
}

int main(int argc, char** argv)
{
    return Wt::WRun(argc, argv, [](const Wt::WEnvironment& env) {
        return std::make_unique<HelloApplication>(env);
        });
}

我在链接器 -> 常规 -> 附加库依赖项和 stmr.lib/stmrd.lib 中有 dll 的 .lib 文件的正确路径 -> 输入 -> [=31= 的附加依赖项] 不知道是导出还是导入dll的问题。

感谢有关问题质量的反馈。

在 C++ 中(在模块之前),头文件需要公开关于 class 的足够信息,以便另一个 cpp 文件创建对象或使用类型。

您刚刚向前声明了它,这足以创建指向该类型的指针或引用,仅此而已。

这些错误与链接、DLL 或导出无关。

所有需要创建实例或以其他方式调用您的类型方法的编译单元都需要查看 class 定义。放在头文件中。方法定义可以在 cpp 文件中并导出。

如果您不想公开细节,pImpl 模式可以帮助您隐藏细节。