我无法使用Visual 2015作为工具链使用WIN32编译简单的CLion应用程序。下面是我得到的链接器错误:
[ 50%] Linking CXX executable test-test.exe
MSVCRTD.lib(exe_winmain.obj) : error LNK2019: unresolved external symbol WinMain referenced in function "int __cdecl invoke_main(void)" (?invoke_main@@YAHXZ)
test-test.exe : fatal error LNK1120: 1 unresolved externals
LINK Pass 1 failed. with 1120下面是再现问题的代码的最简化版本。它包含在这两个文件中:
关于我正在使用的工具的更多细节:
请指教
编辑1
正如我提到的,我尽可能地简化了代码以再现错误。因此,使用std::out。实际上,真正的应用程序是QT应用程序,而不是控制台应用程序。
我在WIN32文件中添加CMakeList.txt参数,以便应用程序在执行EXE时直接启动GUI (而不是加载命令行提示符,然后加载GUI)。
发布于 2018-02-22 11:02:30
这个错误是意料之中的。它只是遵循行的记录行为。
add_executable(${PROJECT_NAME} WIN32 main.cpp)来自可执行文件
如果赋予
WIN32属性,则将在所创建的目标上设置可执行。有关详细信息,请参阅该目标属性的文档。
可执行文档
..。当此属性设置为true时,当在Windows上链接时,将使用WinMain()入口点而不是仅仅main()创建可执行文件。..。
你有两个选择:
WIN32命令中删除add_executable。int main(int, char**)替换为WinMain入口点:int CALLBACK WinMain(HINSTANCE, HINSTANCE, LPSTR, int)。第二个选项可能是您想要的东西,如果您不希望一个控制台窗口弹出。
发布于 2018-02-22 13:44:19
稽查表的优秀答案对此做了很好的介绍,但我有一个小的补充。
因为您编写了一个Qt应用程序:Qt提供了一种机制来以可移植的方式处理这个问题。
Qt附带了一个静态库qtmain.lib,它为您定义了一个WinMain()函数,它只是将所有命令行参数转发给main函数(对于Win32可执行文件,它只是一个普通函数)。对于Qt5,您可以简单地向CMakeLists.txt添加以下内容
if(WIN32)
target_link_libraries(${PROJECT_NAME} PUBLIC Qt5::WinMain)
endif()注意,只有在以前的Qt5调用已经正确找到了find_package时,这才能起作用。
https://stackoverflow.com/questions/48915216
复制相似问题