【问题标题】:"Undefined reference to QAxObject" in Qt Creator 6.1 with CMake带有 CMake 的 Qt Creator 6.1 中的“对 QAxObject 的未定义引用”
【发布时间】:2021-09-21 02:13:26
【问题描述】:

我相信这可能很简单。我整天都在努力寻找解决方案,但我做不到。请帮帮我!

Qt Creator 4.15.1、MinGW 8.1.0 64-bit for C++、CMake 3.19.2(使用 Cmake 是先决条件) Error_screen

我认为错误是我错误地连接了库Qt6AxContainer.lib。

CMakeLists.txt

cmake_minimum_required(VERSION 3.5)

project(HeatMap2 VERSION 0.1 LANGUAGES CXX)

set(CMAKE_INCLUDE_CURRENT_DIR ON)

set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# QtCreator supports the following variables for Android, which are identical to qmake Android variables.
# Check https://doc.qt.io/qt/deployment-android.html for more information.
# They need to be set before the find_package( ...) calls below.

#if(ANDROID)
#    set(ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android")
#    if (ANDROID_ABI STREQUAL "armeabi-v7a")
#        set(ANDROID_EXTRA_LIBS
#            ${CMAKE_CURRENT_SOURCE_DIR}/path/to/libcrypto.so
#            ${CMAKE_CURRENT_SOURCE_DIR}/path/to/libssl.so)
#    endif()
#endif()

find_package(QT NAMES Qt6 Qt5 COMPONENTS Widgets REQUIRED)
find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Widgets REQUIRED)
find_package(Qt6 COMPONENTS AxContainer REQUIRED)


add_library(obj D:/Qt/6.1.2/msvc2019_64/lib/Qt6AxContainer.lib)
target_link_libraries(obj PRIVATE Qt6::AxContainer)


set(PROJECT_SOURCES
        main.cpp
        widget.cpp
        widget.h
        widget.ui
)

if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)
    qt_add_executable(HeatMap2
        MANUAL_FINALIZATION
        ${PROJECT_SOURCES}
    )
else()
    if(ANDROID)
        add_library(HeatMap2 SHARED
            ${PROJECT_SOURCES}
        )
    else()
        add_executable(HeatMap2
            ${PROJECT_SOURCES}
        )
    endif()
endif()

target_link_libraries(HeatMap2 PRIVATE Qt${QT_VERSION_MAJOR}::Widgets)

set_target_properties(HeatMap2 PROPERTIES
    MACOSX_BUNDLE_GUI_IDENTIFIER my.example.com
    MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
    MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
)

if(QT_VERSION_MAJOR EQUAL 6)
    qt_finalize_executable(HeatMap2)
endif()

widjet.cpp

#include "widget.h"
#include "./ui_widget.h"
#include <QtGui>
#include <ActiveQt/qaxobject.h>
#include <ActiveQt/qaxbase.h>
#include <QTableWidget>

QString file("D:\\Programs\\123.xlsx");

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    connect(ui->pushButton, &QPushButton::clicked, this, &Widget::readExcel);

}

Widget::~Widget()
{
    delete ui;
}



void Widget::readExcel()
{
    QAxObject* excel = new QAxObject("Excel.Application", this);
    QAxObject* workbooks = excel->querySubObject("Workbooks");
    QAxObject* workbook = workbooks->querySubObject("Open(const QString&)", file);
    excel->dynamicCall("SetVisible(bool", false);

    QAxObject* worksheet = workbook->querySubObject("Worksheets(int)", 1);

    QAxObject* usedrange = worksheet->querySubObject("UsedRange");
    QAxObject* rows = usedrange->querySubObject("Rows");
    QAxObject* columns = usedrange->querySubObject("Columns");

    int intRowStart = usedrange->property("Row").toInt();
    int intColStart = usedrange->property("Columns").toInt();
    int intCols = columns->property("Count").toInt();
    int intRows = rows->property("Count").toInt();

    qDebug()<<intRows;
    qDebug()<<intCols;

    ui->tableWidget->setRowCount(intRowStart + intRows);
    ui->tableWidget->setColumnCount(intColStart + intCols);

    for ( int row = 0; row < intRows; row++ ){
        for ( int col = 0; col < intCols; col++ ){
            QAxObject* cell = worksheet->querySubObject("Cells(int,int)", col + 1, row + 1);
            QVariant value = cell->dynamicCall("Value()");
            QTableWidgetItem* item = new QTableWidgetItem(value.toString());
            ui->tableWidget->setItem(row, col, item);
        }
    }

    workbook->dynamicCall("Close");
    excel->dynamicCall("Quit()");
}

我做了一些更改,但结果是一样的: enter image description here

add_library(widget widget.cpp ${Cmake_hdr_moc} ${Cmake_form_hdr})
target_link_libraries (widget Qt6::Widgets)

add_executable(heatmap main.cpp)
target_link_libraries(heatmap widget)

add_library(obj D:/Qt/6.1.2/msvc2019_64/lib/Qt6AxContainer.lib)
target_link_libraries(heatmap Qt6::AxContainer)
cmake_minimum_required(VERSION 3.5)

project(HeatMap2 VERSION 0.1 LANGUAGES CXX)

set(CMAKE_INCLUDE_CURRENT_DIR ON)

set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)


find_package(QT NAMES Qt6 Qt5 COMPONENTS Widgets REQUIRED)
find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Widgets REQUIRED)
find_package(Qt6 COMPONENTS AxContainer REQUIRED)

set(PROJECT_SOURCES
        main.cpp
        widget.cpp
        widget.h
        widget.ui
)

if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)
    qt_add_executable(HeatMap2
        MANUAL_FINALIZATION
        ${PROJECT_SOURCES}
    )
else()
    if(ANDROID)
        add_library(HeatMap2 SHARED
            ${PROJECT_SOURCES}
        )
    else()
        add_executable(HeatMap2
            ${PROJECT_SOURCES}
        )
    endif()
endif()

target_link_libraries(HeatMap2 PRIVATE Qt${QT_VERSION_MAJOR}::Widgets)

#=======================================================
target_link_libraries(HeatMap2 PRIVATE Qt6::AxContainer)
#=======================================================

set_target_properties(HeatMap2 PROPERTIES
    MACOSX_BUNDLE_GUI_IDENTIFIER my.example.com
    MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
    MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
)

if(QT_VERSION_MAJOR EQUAL 6)
    qt_finalize_executable(HeatMap2)
endif()

【问题讨论】:

  • 我回滚了您上次的编辑,因为 Stack Overflow 问题应该只针对英语提出。如果你想用俄语问,那么有Stack Overflow на русском
  • "我认为错误是我错误地连接了库Qt6AxContainer.lib。" - 您有target_link_libraries(obj PRIVATE Qt6::AxContainer) 行链接您的obj 库。但是源 widget.cpp 属于 HeatMap2 库/可执行文件,因此您也需要链接该目标。
  • 对不起,我还是不明白如何正确地写语法
  • 你试过target_link_libraries(HeatMap2 PRIVATE Qt6::AxContainer)吗?
  • 现在 cmake 正在为这个声明哭泣“无法为不是由该项目构建的目标“HeatMap2”指定链接库。”

标签: c++ qt cmake qaxobject


【解决方案1】:

我附上一个工作的 CMakeLists.txt

cmake_minimum_required(VERSION 3.5)

project(HeatMap2 VERSION 0.1 LANGUAGES CXX)

set(CMAKE_INCLUDE_CURRENT_DIR ON)

set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)


find_package(QT NAMES Qt6 Qt5 COMPONENTS Widgets REQUIRED)
find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Widgets REQUIRED)
find_package(Qt6 COMPONENTS AxContainer REQUIRED)

set(PROJECT_SOURCES
        main.cpp
        widget.cpp
        widget.h
        widget.ui
)

if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)
    qt_add_executable(HeatMap2
        MANUAL_FINALIZATION
        ${PROJECT_SOURCES}
    )
else()
    if(ANDROID)
        add_library(HeatMap2 SHARED
            ${PROJECT_SOURCES}
        )
    else()
        add_executable(HeatMap2
            ${PROJECT_SOURCES}
        )
    endif()
endif()

target_link_libraries(HeatMap2 PRIVATE Qt${QT_VERSION_MAJOR}::Widgets)

#=======================================================
target_link_libraries(HeatMap2 PRIVATE Qt6::AxContainer)
#=======================================================

set_target_properties(HeatMap2 PROPERTIES
    MACOSX_BUNDLE_GUI_IDENTIFIER my.example.com
    MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
    MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
)

if(QT_VERSION_MAJOR EQUAL 6)
    qt_finalize_executable(HeatMap2)
endif()

我添加的代码:

target_link_libraries(HeatMap2 PRIVATE Qt6::AxContainer)

您已将此调用置于创建 HeatMap2 的行之后 目标,不是吗?目标由 add_library 或 add_executable 调用,目标名称等于第一个 这种调用的论点。

感谢 Tsyvarev 的帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-28
    • 1970-01-01
    • 2018-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多