我很难在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的运行时库只会更改引用的库。
感谢您的帮助:)
答案 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也不会在运行时库中链接,但是由于有代码,它会生成未解决的运行时库符号的要求。