如何解决问题"未解决的外部符号_DllMainCRTStartup @ 12"?

时间:2017-06-13 15:17:33

标签: c++ c visual-studio dll

我想从源代码构建一个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文件夹的某些路径不正确,或者在两个库中分割对象期间,出现问题并且一些信息消失了。 或者我没有使用编译器和链接器的正确选项。

有人可以帮我解决吗?

1 个答案:

答案 0 :(得分:1)

这不是您问题的直接答案,而是用简单的英语解释可能存在的问题。

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

如果您调用的函数是库函数,则必须提供实现该函数的库(WinBase.h位于GetTickCount not found)。如果链接器在提供的库中找不到该函数,则会发出错误(GetTickCount)。

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

unresolved external symbol GetTickCount

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

/LIBPATH

如果您坚持手动操作,这里有一些有趣的读物: