"Undefined reference to QAxObject" in Qt Creator 6.1 with CMake

821 Views Asked by At

I'm sure it's probably something simple. I've been trying to find a solution for the whole day and I can't. Help me please!

Qt Creator 4.15.1, MinGW 8.1.0 64-bit for C++, CMake 3.19.2 (Using Cmake is a prerequisite) Error_screen

I think that the error is that I connected the library Qt6AxContainer.lib incorrectly.

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()");
}

I've made a few changes, but the result is the same: 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()
1

There are 1 best solutions below

0
On

I attach a working one 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()

A code I've added:

target_link_libraries(HeatMap2 PRIVATE Qt6::AxContainer)

You have placed this call after the line which creates HeatMap2 target, haven't you? The target is created by add_library or add_executable call, the name of the target is equal to the first argument of such call.

Thanks Tsyvarev for help!