Связать проект библиотеки с проектом консоли qt / виджета с помощью qt-creator - PullRequest
0 голосов
/ 29 марта 2020

Используя Qt-Creator, давайте предположим, что у меня есть 2 проекта:

  • Библиотека / Библиотека C ++

  • Приложение / Консольное приложение Qt

Я хочу связать проект библиотеки с проектом приложения таким образом, чтобы при сборке последнего компилятор знал, как найти * .a и * .dll (или * .so , если запущен qt-creator в linux) файлы в другом проекте. Я также хотел бы иметь возможность использовать заголовок из библиотеки следующим образом:

#include <lib_example_header>

, и при сборке проекта компилятор также знает, как найти правильный файл * .h.

Кто-нибудь знает, как это сделать?

1 Ответ

0 голосов
/ 29 марта 2020

Мы сделаем это с помощью cmake, так как это то, что вы должны использовать для любого нового проекта, и с ним справиться в 10 раз проще, чем с необходимыми тремя (3!) Проектными файлами для qmake. Не стоит того. Это даже не передаваемый навык.

Итак, допустим, у нас будет библиотека mylibrary stati c, которая будет связана с исполняемым файлом myexe.

Чтобы получить запустили, просто добавьте четыре файла ниже в папку (они завершены) и откройте проект в Qt Creator. Выберите предпочитаемый сборочный комплект (комбинация компилятора и сборки Qt). Затем нажмите Ctrl-B (или ⌘-B на Ma c) и дождитесь окончания сборки до 10 sh. Затем Ctrl-R / ⌘-R, чтобы запустить его. Должно появиться сообщение.

Начиная с этого момента, вы захотите прочитать некоторую документацию по cmake, чтобы выяснить, что означают все перечисленные ниже, особенно различия PRIVATE / INTERFACE / PUBLI C.

# CMakeLists.txt

cmake_minimum_required(VERSION 3.5)

project(test10 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(Qt5 COMPONENTS Widgets REQUIRED)

add_library(mylibrary STATIC
    lib.cpp
    lib.h
)
target_link_libraries(mylibrary PUBLIC Qt5::Core)
target_include_directories(mylibrary PUBLIC .)

add_executable(myexe
    main.cpp
)
target_link_libraries(myexe PRIVATE Qt5::Widgets mylibrary)

Библиотека предоставляет простую getString() функцию:

// lib.h
#pragma once
#include <QString>

namespace lib {
QString getString();
};
// lib.cpp
#include "lib.h"

namespace lib {
QString getString() {
   return QStringLiteral("Hello, world!");
}
}

Исполняемый файл показывает сообщение с использованием этой функции:

// main.cpp
#include <lib.h>
#include <QtWidgets>

int main(int argc, char *argv[])
{
   QApplication a(argc, argv);
   QMessageBox::information(nullptr, "Information", lib::getString());
}

Это, вероятно, самая простая способ достичь этого. Я даже не буду добавлять эквивалентный пример qmake: вам понадобятся три .pro файла, и нет автоматического c способа связать выходные данные подпроекта. CMake - простой способ.

...