c - LNK2019 : unresolved external symbol _main referenced in function ___tmainCRTStartup with DLLs

标签 c winapi dll sdl

这是关于臭名昭著的 ___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/

相关文章:

c - curl 套接字挂起

c - 使用 fscanf 扫描值或如果不存在值则使用默认值

从lua脚本调用c函数

python - 无法在 python 中导入/安装任何库

dll - 为什么 mingw 编译的 Game Maker 扩展在没有 -static 的情况下编译时会在退出时崩溃?

c++ - 创建 DLL 导出对象时出现 Stackoverflow 错误

c - 在 C 中使用线程编程时的棘手死锁

c++ - 从 Windows 卸载时如何从其他用户帐户中删除 ProgID?

c++ - 使用 MS Visual Studio 2010 编译 C++ 程序不依赖于任何外部代码或可再发行组件

c - 分配第一个索引后追加到 cstring