首页 > 解决方案 > 使用我自己的 dll 中的类时出现不完整的类型错误

问题描述

再过一天,关于stackoverflow的另一个愚蠢问题,请原谅。想法是制作 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);
        });
}

我在 Linker -> General -> Additional Library Dependencies 和 stmr.lib/stmrd.lib 中有正确的 .lib 文件路径,在 Linker -> Input -> Additional Dependencies for Release/Debug 不确定是导出问题还是dll的导入。

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

标签: c++dllimportdllexport

解决方案


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

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

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

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

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


推荐阅读