【问题标题】:How to resolve the issue "unresolved extenal symbol _DllMainCRTStartup@12"?如何解决“无法解析的外部符号_DllMainCRTStartup@12”的问题?
【发布时间】:2017-11-15 11:17:01
【问题描述】:

我想从我的源代码构建一个 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)\common\lib" /PDB:"$(__NAME).pdb" /MAP:"$(__NAME).map"

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

第一步:编译所有对象

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

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

但我的标题中出现了链接错误。

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

有人可以帮我解决吗?

【问题讨论】:

  • 有一点标准:很多库路径,但没有库。我建议从新项目向导生成一些示例/测试项目并检查生成的链接命令。您可以在项目属性中查看该命令。
  • DllMainCrtStartup 是 DLL 的 CRT 入口点函数。您要么链接到错误的 CRT 库,要么使用错误的设置进行编译。
  • 我怀疑任何人都会有耐心解决这个问题。 Start a fresh project,并在添加文件时对其进行编译。试着了解你在做什么。

标签: c++ c visual-studio dll


【解决方案1】:

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

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

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

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

/OUT:"m:\temp\Win32Project1\Release\Win32Project1.dll" 
/MANIFEST 
/LTCG:incremental 
/NXCOMPAT 
/PDB:"m:\temp\Win32Project1\Release\Win32Project1.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:\temp\Win32Project1\Release\Win32Project1.lib" 
/DEBUG 
/DLL 
/MACHINE:X86 
/OPT:REF 
/SAFESEH 
/INCREMENTAL:NO 
/PGD:"m:\temp\Win32Project1\Release\Win32Project1.pgd" 
/SUBSYSTEM:WINDOWS 
/MANIFESTUAC:"level='asInvoker' uiAccess='false'" 
/ManifestFile:"Release\Win32Project1.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"Release\vc140.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"Release\Win32Project1.pch"

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

【讨论】:

    猜你喜欢
    • 2012-07-10
    • 2011-12-19
    • 2023-03-20
    • 1970-01-01
    • 2013-07-17
    • 2018-07-01
    • 2018-01-16
    • 2018-02-21
    • 1970-01-01
    相关资源
    最近更新 更多