【问题标题】:Compiling C++ dll Visual Studio linking error with crt library使用 crt 库编译 C++ dll Visual Studio 链接错误
【发布时间】: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


【解决方案1】:

问题来自项目属性->链接器->高级->无入口点中的 /NOENTRY 选项。删除它解决了问题

【讨论】:

    【解决方案2】:

    /NOENTRY 用于创建完全没有任何代码且仅包含位图等的 dll:https://docs.microsoft.com/en-us/cpp/build/creating-a-resource-only-dll?view=vs-2017

    由于 dll(应该)没有代码,Visual Studio 也不会在运行时库中链接,但由于存在代码,它会生成对未解析的运行时库符号的要求。

    【讨论】:

    • 感谢您的解释,我对简短描述的解释不同,因为默认 dll 项目有一个 dllMain 我以为它在谈论那个
    猜你喜欢
    • 2012-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-01
    • 1970-01-01
    • 2012-10-01
    • 1970-01-01
    相关资源
    最近更新 更多