Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在Visual Studio中使用Cmake文件生成Qt项目时发生链接错误_C++_Visual Studio 2012_Linker_Cmake_Qt5 - Fatal编程技术网

C++ 在Visual Studio中使用Cmake文件生成Qt项目时发生链接错误

C++ 在Visual Studio中使用Cmake文件生成Qt项目时发生链接错误,c++,visual-studio-2012,linker,cmake,qt5,C++,Visual Studio 2012,Linker,Cmake,Qt5,我正在尝试使用cmake构建一个qt项目。首先,我在qt creator中编写了一个简单的代码,其中包含main.cpp、mainwindow.cpp和mainwindow.h。下面是我的CMakeLists.txt配置 cmake_minimum_required(VERSION 2.8.11) project(testproject) # Find includes in corresponding build directories set(CMAKE_INCLUDE_CURRENT_D

我正在尝试使用cmake构建一个qt项目。首先,我在qt creator中编写了一个简单的代码,其中包含main.cpp、mainwindow.cpp和mainwindow.h。下面是我的CMakeLists.txt配置

cmake_minimum_required(VERSION 2.8.11)
project(testproject)

# Find includes in corresponding build directories
set(CMAKE_INCLUDE_CURRENT_DIR ON)

# Instruct CMake to run moc automatically when needed.
set(CMAKE_AUTOMOC ON)

# Find the QtWidgets library
find_package(Qt5Widgets)
find_package(Qt5Core)

get_target_property(QtCore_location Qt5::Core LOCATION)

# Tell CMake to create the executable
add_executable(testproject WIN32 main.cpp mainwindow.cpp)

# Use the Widgets module from Qt 5.
target_link_libraries(testproject Qt5::Widgets)
Cmake确实成功生成了VS项目文件。然而,当我尝试在VisualStudio中构建它们时,它会给我带来链接错误。下面列出了一些错误。我无法发布整个错误列表,因为它太长了

>main.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: void __cdecl QWidget::show(void)" (__imp_?show@QWidget@@QEAAXXZ) referenced in function main
2>main.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: __cdecl QApplication::QApplication(int &,char * *,int)" (__imp_??0QApplication@@QEAA@AEAHPEAPEADH@Z) referenced in function main
2>main.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: virtual __cdecl QApplication::~QApplication(void)" (__imp_??1QApplication@@UEAA@XZ) referenced in function main
2>main.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: static int __cdecl QApplication::exec(void)" (__imp_?exec@QApplication@@SAHXZ) referenced in function main
2>mainwindow.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: __cdecl QMetaObject::Connection::~Connection(void)" (__imp_??1Connection@QMetaObject@@QEAA@XZ) referenced in function "public: __cdecl MainWindow::MainWindow(class QWidget *)" (??0MainWindow@@QEAA@PEAVQWidget@@@Z)
2>mainwindow.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: __cdecl QString::~QString(void)" (__imp_??1QString@@QEAA@XZ) referenced in function "public: __cdecl MainWindow::MainWindow(class QWidget *)" (??0MainWindow@@QEAA@PEAVQWidget@@@Z)
2>testproject_automoc.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: virtual int __cdecl QMainWindow::qt_metacall(enum QMetaObject::Call,int,void * *)" (__imp_?qt_metacall@QMainWindow@@UEAAHW4Call@QMetaObject@@HPEAPEAX@Z) referenced in function "public: virtual int __cdecl MainWindow::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@MainWindow@@UEAAHW4Call@QMetaObject@@HPEAPEAX@Z)
2>testproject_automoc.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: static struct QMetaObject const QMainWindow::staticMetaObject" (__imp_?staticMetaObject@QMainWindow@@2UQMetaObject@@B) referenced in function "void __cdecl `dynamic initializer for 'public: static struct QMetaObject const MainWindow::staticMetaObject''(void)" (??__E?staticMetaObject@MainWindow@@2UQMetaObject@@B@@YAXXZ)
2>MSVCRT.lib(crtexew.obj) : error LNK2019: unresolved external symbol WinMain referenced in function __tmainCRTStartup

我正在使用Qt5.3.1、cmake 3.0.2和visual studio 2012。

您必须链接到
QtCore
,您只能链接到
Qt5::Widgets
。将
Qt5::Core
添加到链接库中。至少对我来说,CMake文件不包含可传递的依赖项(因此针对
Qt5::Widgets
的链接是不够的。)

为了解决这个问题,您必须从 添加可执行文件(testproject WIN32 main.cpp mainwindow.cpp)

可能的原因:

  • 检查
    CMakeLists.txt
    中的
    add_executable
    命令中的源文件名是否存在拼写错误。源列表中不存在的文件名将产生链接器错误
    错误LNK2019:未解析的外部符号main referenced
  • 您的入口点函数看起来像什么?
    • WinMain
      需要
      add\u可执行文件(testproject WIN32 main.cpp mainwindow.cpp)
    • main
      需要
      add_可执行文件(testproject main.cpp mainwindow.cpp)
    • 注意:我建议使用
      intmain(intargc,char*argv[])
      ,因为它可以移植到linux,而使用
      WinMain
      则不行

我刚刚遇到这个错误,我在Visual Studio中使用的是
x64调试配置,但是CMAKE中的变量
CMAKE_PREFIX_PATH
是x86 Qt的路径,因此链接器试图将x86 Qt库链接到x64程序,出现了错误


解决方案是将Visual Studio配置和Qt路径更正为相同的体系结构。

Hi Anteru,我将该行更改为
target\u link\u libraries(testproject Qt5::Widgets Qt5::Core)
,但这并没有解决问题。您是否手动检查了链接器路径?您应该针对Qt5::Widgets、Qt5::Gui和Qt5::Core进行链接。添加Qt5::Core后链接错误是否有任何变化?添加Qt Core后没有任何变化。然而,我没有尝试在visualstudi中创建构建文件,而是尝试使用mingw编译器来构建项目。所以我认为我应该在visual Studio中手动检查链接器路径,包括可传递依赖项<代码>Qt5::Widgets
就足够了。