簡體   English   中英

使用 Cmake 文件在 Visual Studio 中構建 Qt 項目時出現鏈接錯誤

[英]Linking Error using Cmake file to build Qt project in Visual Studio

我正在嘗試使用 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 項目文件。 但是,當我嘗試在 Visual Studio 中構建它們時,它給了我鏈接錯誤。 下面列出了一些錯誤。 我無法發布整個錯誤列表,因為它太長了。

>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。

為了解決這個問題,你必須從add_executable(testproject WIN32 main.cpp mainwindow.cpp)刪除 WIN32 語句。

您必須鏈接QtCore ,您只能鏈接Qt5::Widgets Qt5::Core添加到您的鏈接庫中。 至少對我來說,CMake 文件不包含傳遞依賴項(因此鏈接Qt5::Widgets是不夠的。)

可能的原因:

  • 檢查CMakeLists.txt add_executable命令中的源文件名是否存在拼寫錯誤。 源列表中不存在的文件名將產生鏈接器錯誤error LNK2019: unresolved external symbol main referenced
  • 你的入口點函數是什么樣的?
    • WinMain需要add_executable(testproject WIN32 main.cpp mainwindow.cpp)
    • main需要add_executable(testproject main.cpp mainwindow.cpp)
    • 注意:我建議使用int main(int argc, char *argv[]) ,因為它可以移植到 linux,而使用WinMain則不行。

我剛剛遇到了這個錯誤,我在Visual Studio 中使用了x64-Debug配置,但是CMake 中的變量CMAKE_PREFIX_PATHx86 Qt的路徑,因此鏈接器嘗試將x86 Qt庫鏈接到x64程序並且發生了錯誤.

解決方案是將Visual Studio配置和Qt路徑更正為相同的體系結構。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM