C++ 使用CLion/CMake/MSVC 2015编译WIN32应用程序时出现链接错误
我无法使用CLion和Visual Studio 2015作为工具链来编译简单的WIN32应用程序。以下是我得到的链接器错误:C++ 使用CLion/CMake/MSVC 2015编译WIN32应用程序时出现链接错误,c++,winapi,visual-studio-2015,cmake,clion,C++,Winapi,Visual Studio 2015,Cmake,Clion,我无法使用CLion和Visual Studio 2015作为工具链来编译简单的WIN32应用程序。以下是我得到的链接器错误: [ 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)" (?invo
[ 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
下面是重现该问题的代码的最简化版本。它包含在以下两个文件中:
- CMakeList.txt
cmake_minimum_required(VERSION 3.9.6) add_executable(${PROJECT_NAME} WIN32 main.cpp)
- main.cpp
#include <iostream> int main(int argc, char **argv) { std::cout << "HELLO WORLD!" << std::endl; return 0; }
,则将在创建的目标上设置属性。有关详细信息,请参阅该目标属性的文档 文件包括: […]当此属性设置为true时,在Windows上链接的可执行文件将使用WinMain()入口点而不是main()。[…] 您有两种选择:#包括 int main(int argc,字符**argv){
std::cout错误是意料之中的。它只是遵循记录在案的行行为
发件人: 如果给定了WIN32add_executable(${PROJECT_NAME} WIN32 main.cpp)
- 从
命令中删除add_executable
WIN32
- 将
替换为入口点:intmain(int,char**)
intcallbackwinmain(HINSTANCE,HINSTANCE,LPSTR,int)
,它为您定义了一个qtmain.lib
函数,该函数只需将所有命令行参数转发给WinMain()
函数(对于Win32可执行文件,该函数只是一个普通函数)。对于Qt5,您只需将以下内容添加到main
:CMakeLists.txt
if(WIN32) target_link_libraries(${PROJECT_NAME} PUBLIC Qt5::WinMain) endif()
请注意,只有在先前的
调用已正确找到Qt5的情况下,此操作才会起作用。会丢失cmake文件中的WIN32条目。此外,为什么要将CLion与VS一起使用?为什么不只使用VS?您必须定义find_package
而不是WinMain
,这对于main
控制台来说很方便。“这是我得到的编译错误”-不,这不是你得到的编译器错误,“错误LNK2019:。。。"是一个链接错误。不同的是,编译器在这里没有代码的问题,但是链接器确实。@ RunDROP—不,你不需要为控制台应用程序定义WiMeA.@ NeilButterworth我用Java、PHP和C++开发。JeTeNejava为井手三种语言提供了IDE特征一致性。另外,我不是视觉支柱的大粉丝。io作为IDE。感谢您的洞察力。添加到Qt5::WinMain的链接修复了我的问题我的QT应用程序。
- 从