使用 wxWdigets 时发现的好玩的事情–VC++ 编译器怎么找到 WinMain 或 wWinMain 函数
在使用 wxWdigets 时,发现 wxIMPLEMENT_APP(MyApp);
这一行代码会被扩展成下面的代码:
extern "C" int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, wxCmdLineArgType lpCmdLine, int nCmdShow) {
; ; return wxEntry(hInstance, hPrevInstance, lpCmdLine, nCmdShow);
} MyApp& wxGetApp() {
return *static_cast<MyApp*>(wxApp::GetInstance());
} wxAppConsole* wxCreateApp() {
wxAppConsole::CheckBuildOptions("3" "." "2" " (" "wchar_t" ",Visual C++ " "1900" ",STL containers" ",compatible with 3.0" ")", "your program"); return new MyApp;
} wxAppInitializer wxTheAppInitializer((wxAppInitializerFunction)wxCreateApp)
可以看到,入口函数是 WinMain
。在我编译完成 wxWidgets 源代码,并且把编译后的库安装到另一个路径后,我的项目已经脱离了 wxWidgets 源代码目录,也就是说我的项目的编译过程,是不被编译 wxWidgets 代码时的目录结构、配置文件影响的。这种情况下,应该是只需要设置好头文件路径、库路径,就可以正常使用 wxWidgets 了。
然而,意想不到的事情发生了。同一代码,wxWdigets 构建目录中的 Demo bombs 可以编译并且链接成功,在我的项目目录里就不能链接成功,错误原因如下:
LIBCMTD.lib(exe_wwinmain.obj) : error LNK2019: 无法解析的外部符号 wWinMain,函数 "int __cdecl invoke_main(void)" (?invoke_main@@YAHXZ) 中引用了该符号
没有找到 wWinMain。当然不会找到,因为 wxWidgets 定义的入口点是 WinMain
。可是,为什么 bombs 可以成功链接呢?经过一些研究发现,把 bombs 所属的解决方䅁里的其它项目全部移除;把 bombs 这个项目里