这是关于臭名昭著的 ___tmainCRTStartup 未解析的外部符号的另一个线程。是的,这又是关于 SDL 的,但它有一个 AFAICS 尚未在此介绍的变化。 让我先澄清一些参数:
1) 我正在尝试构建一个静态链接到 SDL2.lib 的 DLL。
2) 我没有使用 Visual Studio,而是使用 Visual C 和控制台(首先是 cmake,然后是 nmake)。
3) 该项目完全由 C 语言编写,其中没有 C++ 代码(除非 SDL2 中有 C++,但据我所知 SDL2 完全由 C 语言编写)
4) SDL2.lib 中收集的所有对象和其他对象均使用/MT 进行编译,即我想静态链接到 Visual C 运行时 (libcmt.lib)。
5) 然后创建 SDL2.lib,如下所示:
link /nologo /lib /out:SDL2.lib file1.obj file2.obj....
6) 目标DLL的链接如下:
link /dll /subsystem:WINDOWS /out:test.dll file1.obj file2.obj ... kernel32.lib user32.lib gdi32.lib shell32.lib ole32.lib oleaut32.lib imm32.lib winmm.lib version.lib SDL2.lib
令我困惑的是上面的调用会产生以下错误:
LNK2019: unresolved external symbol _main referenced in function ___tmainCRTStartup
这怎么可能发生?我清楚地将 /dll 传递给 link.exe 那么到底为什么 C 运行时要寻找 main() 呢?它应该在寻找 DllMain()! DLL 中的 main() 符号根本没有任何意义,但我却收到了这个令人困惑的错误!
肯定是 SDL2.lib 内部的某些东西导致了这个问题,但老实说,我不知道什么会迫使链接器在这里寻找 main() 入口点。我的意思是,SDL2.lib 是一个链接器库,应该完全目标中立,即应该可以将 SDL2.lib 链接到 WinMain() 可执行文件,但也应该可以链接 SDL2。 lib 针对 DllMain() 库,但这里似乎拒绝链接到 DLL!
有人知道这里可能出了什么问题吗?我已经搜索了好几个小时了,但我完全没有意识到这一点。
编辑:有趣的是,当使用/MD 编译所有内容时,不会出现此问题。仅当使用/MT 时才会发生。我真的完全不知道这可能是什么原因。
EDIT2:我还尝试使用/DSDL_MAIN_HANDLED 编译 SDL2,但它并没有使错误消失。
最佳答案
差不多四年后,我终于重新审视了这个问题,在检查了所有目标文件以查看哪个文件是罪魁祸首之后,我终于在 src/SDL.c
中找到了错误。它的末尾有这些行:
#if defined(__WIN32__)
#if !defined(HAVE_LIBC) || (defined(__WATCOMC__) && defined(BUILD_DLL))
/* Need to include DllMain() on Watcom C for some reason.. */
BOOL APIENTRY
_DllMainCRTStartup(HANDLE hModule,
DWORD ul_reason_for_call, LPVOID lpReserved)
{
switch (ul_reason_for_call) {
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
#endif /* building DLL with Watcom C */
#endif /* __WIN32__ */
因此,SDL 总是定义一个 _DllMainCRTStartup
符号,这似乎混淆了链接器并导致 OP 中显示的错误。删除上面的代码(或定义HAVE_LIBC
)最终解决了问题,我可以使用/MT
构建SDL2(尽管我仍然不知道为什么用编译) >/MD
没有造成任何问题,因为使用 /MD
编译时,AFAICS _DllMainCRTStartup
也会被定义,但它似乎不会造成任何损害这种情况)。
问题终于解决了。
关于c - LNK2019 : unresolved external symbol _main referenced in function ___tmainCRTStartup with DLLs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25067151/