首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >QtCreator6.1中带有QAxObject的“未定义的对CMake的引用”

QtCreator6.1中带有QAxObject的“未定义的对CMake的引用”
EN

Stack Overflow用户
提问于 2021-07-11 17:15:52
回答 1查看 424关注 0票数 0

我肯定这可能是很简单的事。我一整天都在寻找解决办法,但我做不到。请救救我!

Qt 4.15.1,MinGW 8.1.0 64位用于C++,CMake 3.19.2 (使用Cmake是先决条件) 屏幕

我认为错误在于我没有正确地连接库Qt6AxContainer.lib。

CMakeLists.txt

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
#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()");
}

我做了一些修改,但结果是一样的:在这里输入图像描述

代码语言:javascript
运行
复制
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)
代码语言:javascript
运行
复制
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()
EN

回答 1

Stack Overflow用户

发布于 2021-07-12 09:13:26

我附上了一个工作的CMakeLists.txt

代码语言:javascript
运行
复制
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()

我添加了一个代码:

代码语言:javascript
运行
复制
target_link_libraries(HeatMap2 PRIVATE Qt6::AxContainer)

您已经将此调用放在创建HeatMap2目标的行之后,不是吗?目标由add_library或add_executable调用创建,目标名称等于该调用的第一个参数。

谢谢齐瓦列夫的帮助!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68338431

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档