5

我需要解析 unicode 参数,所以我想改用wmain

所以而不是

int main(int argc, char** argv)

我想用

int wmain(int argc, wchar_t** argv)

问题是视觉工作室无法识别 wmain,而是尝试使用 main:

error LNK2019: unresolved external symbol main referenced in function __tmainCRTStartup

这是我尝试过的:

  • 更改属性->常规->字符集
  • 更改入口点(在这种情况下,我遇到了很多甚至没有入口点的库的兼容性错误,因此无法在此处指定)。

    warning LNK4258: directive '/ENTRY:mainCRTStartup' not compatible with switch '/ENTRY:mainWCRTStartup'; ignored
    
  • 而是尝试了 _tmain,只是为了发现它只是一个将其更改为 main 的宏。

  • 使用 #pragma 注释(链接器,“/SUBSYSTEM:CONSOLE /ENTRY:mainCRTStartup”)
  • 使用 UNICODE 宏

没有什么帮助。

编辑:我想提一下,我正在使用 vs120_xp(Win xp 兼容)工具集,但是当我尝试使用默认工具集时,它仍然无法正常工作。

Edit2:我尝试制作全新的项目,并且 wmain 开箱即用。我不必更改任何内容,因此它必须是当前项目中的某些特定设置导致它。

4

2 回答 2

11
  Using the #pragma comment(linker, "/SUBSYSTEM:CONSOLE /ENTRY:mainCRTStartup")

你越来越近了,还不够近。CRT 有四个入口点:

  • mainCRTStartup => 调用 main(),控制台模式应用程序的入口点
  • wmainCRTStartup => 调用 wmain(),如上,但 Unicode 版本
  • WinMainCRTStartup => 调用 WinMain(),本机 Windows 应用程序的入口点
  • wWinMainCRTStartup => 调用 wWinMain(),如上,但 Unicode 版本

所以它是/ENTRY:wmainCRTStartup

请注意,假设默认控制台代码页,命令行参数将转换为 Unicode。这有点不可预测,它是仅在西欧和美洲的遗留 437 OEM 代码页。用户可能需要使用 CHCP 命令(更改代码页)并修改控制台窗口字体以使您满意。YMMV。

于 2015-02-05T12:04:48.787 回答
1

我将正常工作的新项目与我们的项目之间的差异合并了几个小时,直到我发现问题是由我们对 allegro 预处理器定义的错误配置引起的。

在 win/alconfig.h 的 allegro 库的深处,有这些行

#ifndef ALLEGRO_NO_MAGIC_MAIN
  #if defined _MSC_VER && !defined ALLEGRO_LIB_BUILD
    #pragma comment(linker,"/ENTRY:mainCRTStartup")
  #endif
#endif

我们确实为 allegro 库编译设置了这个宏,但是 allegro 文件也包含在主项目中,没有指定这个。在主项目中定义宏解决了这个问题(显然)。

我真的没有看到这个!

于 2015-02-05T15:25:26.587 回答