如何解决问题"unresolved extenal symbol _DllMainCRTStartup@12"?

How to resolve the issue "unresolved extenal symbol _DllMainCRTStartup@12"?

本文关键字:DllMainCRTStartup@12 symbol unresolved 解决问题 extenal      更新时间:2023-10-16

我想从我的源代码构建一个DLL文件,但我遇到了错误。在链接期间,命令行无法解析这么多对象并放弃了链接。

我决定将对象拆分为两个库,然后从这两个库创建 DLL。

我运行我的makefile,但链接因一个新错误而中断:unresolved external symbol _DllMainCRTStartup@12

我使用以下设置:

  • 编译器选项:/Od /MT /EHsc /MP /Zi /Zl /Zp8 /c /DSOMEDEFINE
  • 链接器选项:/MAPINFO:EXPORTS /SUBSYSTEM:WINDOWS /MACHINE:X86 /MANIFEST /INCREMENTAL:NO /NOLOGO /DLL /DEBUG /OUT:"$(__NAME).dll" /LIBPATH:$(__MS_LIB_PATH) /LIBPATH:"$(SW_HOME)lib" /LIBPATH:"$(SW_HOME)commonlib" /PDB:"$(__NAME).pdb" /MAP:"$(__NAME).map"

我的构建过程分三个步骤运行:

第一步:编译所有对象

第二步:使用 lib.exe 创建两个扩展名为 * 的文件。自由

第三步:使用链接.exe从LIB文件创建DLL文件。

但是我有一个链接错误,就像我的标题一样。

所以,我想问题发生是因为链接期间指向 Visual Studio 文件夹的某些路径不正确,或者在拆分两个库中的对象期间出现问题并且某些信息消失了。 或者我没有为编译器和链接器使用正确的选项。

有人可以帮助我解决它吗?

这不是对您的问题的直接回答,而是用简单的英语解释可能出现的问题。

如果调用函数,则首先必须为其提供声明。编译器将根据声明检查您的调用。如果函数是库函数,编译器将在库的一个接口文件中查找它(例如GetTickCount声明是WinBase.h)。如果不包含声明所在的文件,编译器将发出错误(GetTickCount找不到)。

如果您要调用的函数是库函数,则必须提供实现该函数的库(GetTickCount位于kernel32.lib)。如果链接器在提供的库中找不到该函数,它将发出错误(未解析的外部符号GetTickCount)。

实际上,您没有在选项中指定任何库,只需指定一些额外的库路径(/LIBPATH)。因此,链接器找不到您正在调用的函数的实现:">在链接期间,命令行无法解析这么多对象并放弃了链接。这是自动生成的选项的样子(请注意差异):

/OUT:"m:tempWin32Project1ReleaseWin32Project1.dll" 
/MANIFEST 
/LTCG:incremental 
/NXCOMPAT 
/PDB:"m:tempWin32Project1ReleaseWin32Project1.pdb" 
/DYNAMICBASE "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib" 
/IMPLIB:"m:tempWin32Project1ReleaseWin32Project1.lib" 
/DEBUG 
/DLL 
/MACHINE:X86 
/OPT:REF 
/SAFESEH 
/INCREMENTAL:NO 
/PGD:"m:tempWin32Project1ReleaseWin32Project1.pgd" 
/SUBSYSTEM:WINDOWS 
/MANIFESTUAC:"level='asInvoker' uiAccess='false'" 
/ManifestFile:"ReleaseWin32Project1.dll.intermediate.manifest" 
/OPT:ICF 
/ERRORREPORT:PROMPT 
/NOLOGO 
/TLBID:1

关于CRT,再次让VC为您完成工作。让 VC 选择运行时库:

/Yu"stdafx.h" 
/GS /GL /analyze- /W3 /Gy /Zc:wchar_t /Zi /Gm- /O2 
/Fd"Releasevc140.pdb" 
/Zc:inline 
/fp:precise 
/D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_USRDLL" /D "WIN32PROJECT1_EXPORTS" /D "_WINDLL" /D "_UNICODE" /D "UNICODE" 
/errorReport:prompt 
/WX- 
/Zc:forScope 
/Gd /Oy- /Oi /MD 
/Fa"Release" 
/EHsc 
/nologo 
/Fo"Release" 
/Fp"ReleaseWin32Project1.pch"

如果您坚持手动做事,这里有一些有趣的阅读:

  • CRT 库功能
  • /MD,/MT,/LD (使用运行时库)
  • /条目(入口点符号)
相关文章:
  • 没有找到相关文章