【发布时间】:2019-02-13 15:24:34
【问题描述】:
我很难在 Visual Studio 上编译 C/C++ dll。它似乎链接到 CRT 库。
一个简单的 VS c++ dll 项目。刚刚删除了重新编译的头文件,并添加了/NOENTRY。导出方法有效,但是一个简单的类(不打算导出)会引发很多与 CRT 库的链接错误:
测试.h:
class ITest
{
public:
virtual void foo() = 0;
}
class Test final : public ITest
{
public:
Test();
~Test();
void foo();
};
// extern "C" __declspec(dllexport) ITest* __cdecl CreateTest();
测试.cpp
#include "Test.h"
Test::Test() {}
Test::~Test() {}
Test::foo() {}
// extern "C" __declspec(dllexport) ITest* __cdecl CreateTest() { return new Test; }
错误:
Test.obj : error LNK2001: unresolved external symbol _purecall
msvcrt.lib(delete_scalar.obj) : error LNK2019: unresolved external symbol free referenced in function "void __cdecl operator delete(void *)" (??3@YAXPEAX@Z)
取消注释导出会引发更多 msvcrt.lib 链接错误,更改 MDd、MT、MTd 的运行时库只会更改引用的库。
感谢您的帮助:)
【问题讨论】:
-
请提供minimal reproducible example,是编译你的dll还是链接你的dll时出错?你在使用外部库吗?如果是这样,这些库使用哪个运行时?
-
这其实是最小的例子,原来的代码比较大但是还是和crt库有关。我刚刚创建了一个没有其他库或 dll 的 VS dll 项目。仅在 Project Properties->C/C++->Code Generation->Runtime Library : /MD 中引用 msvcrt.lib。问题是当我编译 dll 时
-
无法重现,您尝试过干净的构建吗?
-
是的,我刚刚发现了问题,(我已经编辑了问题中的要点)。这是因为我放了 /NOENTRY 但我想知道为什么它会引发这些错误,因为 /NOENTRY 应该是仅用于资源的 dll,我认为是这种情况
标签: c++ visual-studio dll