CMake: Как добавить qt классы в подпроект?

92
27 февраля 2021, 00:10
  1. Как добавить в a.cpp библиотеки Qt? (в a.cpp #include <QDebug.h> не находит файл)
  2. Как избавиться от относительного пути? (в mainwindow.cpp заменить строчку #include "../a/a.h" на #include "a.h")
  3. Советы и предложения. Я только начинаю изучать CMake.

Проект пустой, который создается по умолчанию (в формате qmake).

Структура проекта

+ cmakeTest
    - CMakeLists.txt
    + test
        - CMakeLists.txt
        - main.cpp
        - mainwindow.h
        - mainwindow.cpp
        - mainwindow.ui
    + a
        - CMakeLists.txt
        - a.h
        - a.cpp

cmakeTest/CMakeLists.txt

cmake_minimum_required(VERSION 3.15.0)
project(cmakeTest)
add_subdirectory(test)
add_subdirectory(a)

cmakeTest/test/CMakeLists.txt

cmake_minimum_required(VERSION 3.15.0)
project(test)
# Find includes in corresponding build directories
set(CMAKE_INCLUDE_CURRENT_DIR ON)
# Instruct CMake to run moc automatically when needed
set(CMAKE_AUTOMOC ON)
# Create code from a list of Qt designer ui files
set(CMAKE_AUTOUIC ON)
# Find the QtWidgets library
find_package(Qt5 COMPONENTS Widgets REQUIRED)
set(test_SRCS
    mainwindow.ui
    mainwindow.cpp
    main.cpp
)
add_executable(helloworld WIN32 ${test_SRCS})
# Use the Widgets module from Qt 5
target_link_libraries(helloworld Qt5::Widgets aLib)

cmakeTest/a/CMakeLists.txt

cmake_minimum_required(VERSION 3.15.0)
set(a_SRCS
    a.cpp
)
add_library(aLib STATIC ${a_SRCS})

cmakeTest/test/mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "../a/a.h"
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    A a;
}
MainWindow::~MainWindow()
{
    delete ui;
}

cmakeTest/a/a.cpp

#include "a.h"
#include <iostream>
//#include <QDebug.h> // не находит =(
A::A()
{
    std::cout << "class A" << std::endl;
}

UDP: Решение

  1. Найти виджеты и добавить директории:

cmakeTest/a/CMakeLists.txt

cmake_minimum_required(VERSION 3.15.0)
find_package(Qt5Widgets)
include_directories(${Qt5Widgets_INCLUDE_DIRS})
set(a_SRCS
    a.cpp
    a.h
)
add_library(aLib STATIC ${a_SRCS})
  1. Добавления путей поиска заголовков:

cmakeTest/test/CMakeLists.txt

cmake_minimum_required(VERSION 3.15.0)
project(test)
# Find includes in corresponding build directories
set(CMAKE_INCLUDE_CURRENT_DIR ON)
# Instruct CMake to run moc automatically when needed
set(CMAKE_AUTOMOC ON)
# Create code from a list of Qt designer ui files
set(CMAKE_AUTOUIC ON)
# Find the QtWidgets library
find_package(Qt5 COMPONENTS Widgets REQUIRED)
set(test_SRCS
    mainwindow.ui
    mainwindow.cpp
    mainwindow.h
    main.cpp
)
add_executable(helloworld WIN32 ${test_SRCS})
target_include_directories(helloworld PUBLIC ../a)
# Use the Widgets module from Qt 5
target_link_libraries(helloworld Qt5::Widgets aLib)
Answer 1

1) вы не можете в cpp файл добавить библиотеку - #include это директива препроцессора и для того, чтобы она верно работала нужно либо указывать полный путь к хидеру (плохой вариант), либо указать компилятору где его искать. В cmake это делается указанием target_include_directories. В случае с qt достаточно указать target_link_libraries с соответствующим модулем.

2) смотрите первый

3) смотрите официальную документацию. Есть ещё методичка на русском: Дубров "система построения проектов cmake"

READ ALSO
Подсчет количества единичных бит

Подсчет количества единичных бит

Нужно посчитать количество единичных бит, запрещается использовать любые арифметические операции (даже инкремент) и любые сторонние библиотеки...

108
add_subdirectory добавить папку уровня выше

add_subdirectory добавить папку уровня выше

Продолжение изучения CMake: Как добавить qt классы в подпроект?Теперь необходимо без корневого файла CMakeLists

89
Ввод двумерного массива с клавиатуры

Ввод двумерного массива с клавиатуры

Как ввести массив E[N][N] с клавиатуры? получилось только определить с помощью #define

82
Как конвертировать string в _bstr_t

Как конвертировать string в _bstr_t

Как string test конвертировать в _bstr_t c++

113