使用crt库编译C ++ dll Visual Studio链接错误

时间:2019-02-13 15:24:34

标签: c++ visual-studio dll

我很难在Visual Studio上编译C / C ++ dll。它似乎已链接到CRT库。

一个简单的VS c ++ dll项目。只是删除了重新编译的头文件,并添加了/ NOENTRY。导出方法可以使用,但是一个简单的类(不打算导出)会在CRT库中引发很多链接错误:

Test.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();

Test.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的运行时库只会更改引用的库。

感谢您的帮助:)

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

proc checker xor bx, bx mov ax,05h ; Return button press data int 33h shr cx, 1 mov ax, 0A000h sub [mikoom], ax shr [mikoom], 2 jmp cont check: mov ax,05h ; Return button press data int 33h shr cx, 1 cont: cmp cx, [mikoom] jae odchaecker jmp check odchaecker: mov ax, 16h add [mikoom], ax cmp cx, [mikoom] jbe caller mov ax, 16h sub [mikoom], ax jmp check caller: call CleanScreen ret endp proc CleanScreen mov ah, 0 int 10h ret endp 用于创建完全没有任何代码且仅包含位图等的dll:https://docs.microsoft.com/en-us/cpp/build/creating-a-resource-only-dll?view=vs-2017

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