c++ - 使用我自己的 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++ 中(在模块之前),头文件需要为另一个 cpp 文件公开有关类的足够信息,以创建对象或使用类型。
您刚刚声明了它,这足以使指针或引用指向该类型,仅此而已。
这些错误与链接、DLL 或导出无关。
所有需要创建实例或以其他方式调用您的类型的方法的编译单元都需要查看类定义。把它放在头文件中。方法定义可以在 cpp 文件中并导出。
如果您不想暴露细节,pImpl 模式可以帮助您隐藏细节。
推荐阅读
- java - 使多次更改触发导致更少的操作
- java - android-将位图转换为矩阵数组
- python - AttributeError:模块“tensorflow”没有属性“RunOptions”
- python - 如何启用我的 html 页面以使用两个布尔字段值检查用户并使用“if”语句显示他们的数据?
- python - Django愿望清单功能实现
- php - 在 laravel7.9.2 项目中运行 composer update 时发生“errno=5 输入/输出错误”
- javascript - JavaScript 检查想要的 url 是否在 window.location.href
- android - 设计编辑器不可用
- if-statement - IFS 不拒绝返回数组
- json - 如何从 Flutter 中的 JSON 实例中获取价值?