如何解决问题"unresolved extenal symbol _DllMainCRTStartup@12"?
How to resolve the issue "unresolved extenal symbol _DllMainCRTStartup@12"?
我想从我的源代码构建一个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 (使用运行时库)
- /条目(入口点符号)
- 没有找到相关文章