Evgenii Legotckoi
Evgenii Legotckoi28. Juli 2016 11:40

Qt/C++ - Lektion 056. Anschließen der Boost-Bibliothek in Qt für MinGW- und MSVC-Compiler

Ich werde meine erste Bekanntschaft mit Boost unter Windows beginnen, indem ich vorkompilierte Bibliotheken zusammenbaue und sie mit einem Qt-Projekt verbinde. In diesem Fall werde ich den Code eines der Hello Worlds aus der Boost-Dokumentation verwenden, nämlich aus der Installation des Gebietsschemas mit Boost.

Build-Boost für MinGW

Laden Sie zunächst die neueste Version von Boost herunter (zum Zeitpunkt des Schreibens dieses Artikels ist dies Version 1.61) und entpacken Sie das Archiv in einen der Ordner. In meinem Fall wurde das Archiv in den folgenden Pfad entpackt:

D:\EVILEG\boost_1_61_0

Öffnen Sie dann die Konsole und gehen Sie zu diesem Ordner. Dieser Ordner enthält eine Batchdatei bootstrap.bat zum Erstellen des Tools bjam, , das die Kompilierung von Bibliotheken für den Zielcompiler steuern soll.

Führen Sie den folgenden Befehl aus, um dieses Tool für MinGW zu erstellen:

bootstrap.bat gcc

Nachdem das Tool erstellt wurde, erstellen wir alle erforderlichen Bibliotheken mit dem folgenden Befehl:

b2 toolset=gcc link=shared --prefix=boost_mingw_530 install  // ,где
    // toolset  - это инструментарий, которым будут собираться библиотеки, 
    //            то есть тип компилятора, которым Вы будете собирать библиотеки
    // link     - это тип библиотек, в данном случае shared - динамические
    // --prefix - папка куда будут скопированы заголовочные файлы и собранные библиотеки
    //            в моём случае D:\EVILEG\boost_1_61_0\boost_mingw_530

Dann können Sie Ihren Geschäften nachgehen, denn dieser Prozess ist nicht schnell.


Notiz

Ich stelle fest, dass die Wahl des Compilers, mit dem die Bibliotheken erstellt werden, davon abhängt, welche Umgebungsvariablen in Ihrem Betriebssystem festgelegt sind. Das heißt, ab welchem Pfad wird der g++ Compiler in der PATH-Variablen eingetragen.

Ich habe Pfade aus früheren Versionen von Qt:

D:\Qt\5.6\mingw49_32\bin;
D:\Qt\Tools\mingw490_32\bin;

Und dementsprechend habe ich bei der Ausgabe Bibliotheken für den MinGW 4.9.2-Compiler erhalten. Ja, ich habe die vorherige Version von Qt 5.6 mit MinGW 4.9.2 noch nicht deinstalliert . Muss ich dazu sagen, dass mein Projekt unter Qt5.7 mit dem MinGW 5.3.0 Compiler sich weigerte zu bauen?

Nachdem wir die richtigen Pfade vorgeschrieben hatten, gelang es uns, die erforderlichen Bibliotheken zu sammeln:

D:\Qt\5.7\mingw53_32\bin;
D:\Qt\Tools\mingw530_32\bin;

Build-Boost für MSVC

Der Prozess wird vollständig derselbe sein wie für MinGW, aber mit einem kleinen Unterschied in den Befehlen.

bootstrap.bat vc12    // Пока использую MSVC 2013 Community
b2 toolset=msvc-12.0 link=shared --prefix=boost_msvc install

Während des Build-Prozesses können einige Fehler auftreten, die auch durch Pfade in Betriebssystemvariablen verursacht werden. Zum Beispiel so:

"cl" не является внутренней или внешней командой ... и т.д.

Es wird behandelt, indem Pfade zum MSVC-Compiler vorgeschrieben werden, zum Beispiel:

D:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin;

Es kann auch Probleme geben, dass die Pfade zu den Header-Dateien der Standardbibliothek nicht gefunden werden. Was wird durch die Informationen in der Datei bootstrap.log ausgedrückt:

###
### Using 'vc12' toolset.
###

D:\EVILEG\boost_1_61_0\tools\build\src\engine>if exist bootstrap rd /S /Q bootstrap 

D:\EVILEG\boost_1_61_0\tools\build\src\engine>md bootstrap 

D:\EVILEG\boost_1_61_0\tools\build\src\engine>cl /nologo /RTC1 /Zi /MTd /Fobootstrap/ /Fdbootstrap/ -DNT -DYYDEBUG -wd4996 kernel32.lib advapi32.lib user32.lib /Febootstrap\jam0  command.c compile.c constants.c debug.c execcmd.c execnt.c filent.c frames.c function.c glob.c hash.c hdrmacro.c headers.c jam.c jambase.c jamgram.c lists.c make.c make1.c object.c option.c output.c parse.c pathnt.c pathsys.c regexp.c rules.c scan.c search.c subst.c timestamp.c variable.c modules.c strings.c filesys.c builtins.c md5.c class.c cwd.c w32_getreg.c native.c modules/set.c modules/path.c modules/regex.c modules/property-set.c modules/sequence.c modules/order.c 
command.c
d:\evileg\boost_1_61_0\tools\build\src\engine\jam.h(71) : fatal error C1034: ctype.h: no include path set
compile.c
d:\evileg\boost_1_61_0\tools\build\src\engine\jam.h(71) : fatal error C1034: ctype.h: no include path set
constants.c
debug.c
d:\evileg\boost_1_61_0\tools\build\src\engine\jam.h(71) : fatal error C1034: ctype.h: no include path set
execcmd.c
d:\evileg\boost_1_61_0\tools\build\src\engine\jam.h(71) : fatal error C1034: ctype.h: no include path set
execnt.c
d:\evileg\boost_1_61_0\tools\build\src\engine\jam.h(71) : fatal error C1034: ctype.h: no include path set
filent.c
d:\evileg\boost_1_61_0\tools\build\src\engine\jam.h(71) : fatal error C1034: ctype.h: no include path set
frames.c
d:\evileg\boost_1_61_0\tools\build\src\engine\jam.h(71) : fatal error C1034: ctype.h: no include path set
function.c
d:\evileg\boost_1_61_0\tools\build\src\engine\jam.h(71) : fatal error C1034: ctype.h: no include path set
glob.c
d:\evileg\boost_1_61_0\tools\build\src\engine\jam.h(71) : fatal error C1034: ctype.h: no include path set
hash.c

Sie werden auch etwas Schamanismus mit den Pfaden benötigen oder sogar MSVC neu installieren, oder Sie können dem einfachsten Pfad folgen, der Nervenzellen rettet, und einfach die vorkompilierten Bibliotheken von der Boost-Website herunterladen.

Verbinden von Boost mit einem Qt-Projekt

Lassen Sie uns für die anfängliche Boost-Verbindung eine einfache Konsolenanwendung vorbereiten, die die Uhrzeit, das Datum und einige andere Informationen mithilfe der Gebietsschemaeinstellung mithilfe der Bibliothek Boost.locale. anzeigt.

Das Projekt besteht nur aus zwei Dateien:

  1. QtBoostHello.pro
  2. main.cpp

QtBoostHello.pro

Je nach Compiler binden wir die notwendigen Header-Dateien und Bibliotheken an:

  • INCLUDEPATH - schließt Header-Dateien ein
  • LIBS - Bibliotheken verbinden
QT += core
QT -= gui

CONFIG += c++11

TARGET = QtBoostHello
CONFIG += console
CONFIG -= app_bundle

TEMPLATE = app

win32-g++ {
    INCLUDEPATH += D:/EVILEG/boost_1_61_0/boost_mingw_530/include/boost-1_61
    LIBS += -LD:/EVILEG/boost_1_61_0/boost_mingw_530/lib -llibboost_locale-mgw53-mt-1_61
} else:win32-msvc* {
    INCLUDEPATH += D:/EVILEG/boost_1_61_0/boost_msvc_2012/include/boost-1_61
    LIBS += -LD:/EVILEG/boost_1_61_0/boost_msvc_2012/lib -lboost_locale-vc120-mt-1_61
}

SOURCES += main.cpp

main.cpp

Die Hauptfunktion enthält eine der Klassen aus der Boost-Bibliothek – das ist generator. Wir werden nicht tief graben, wir müssen nur das Projekt ausführen. Wir stellen nur fest, dass es zum Festlegen des Gebietsschemas verwendet wird, wie aus dem Code ersichtlich ist.

Außerdem wird für diese Klasse eine dynamische Bibliothek verwendet. Aber nicht alle Funktionen erfordern Bibliotheken, ein Teil von Boost sind Vorlagenfunktionen, die vollständig in Header-Dateien definiert sind.

#include <QCoreApplication>
#include <boost/locale.hpp>

using namespace boost::locale;
using namespace std;

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    generator gen;
    locale loc=gen("en_US.UTF-8");
    locale::global(loc);
    // Make it system global

    cout.imbue(loc);
    // Set as default locale for output

    cout <<format("Hello {1,date} at {1,time} we had run our first localization example") % time(0)
          <<endl;

    cout<<"This is how we show numbers in this locale "<<as::number << 103.34 <<endl;
    cout<<"This is how we show currency in this locale "<<as::currency << 103.34 <<endl;
    cout<<"This is typical date in the locale "<<as::date << std::time(0) <<endl;
    cout<<"This is typical time in the locale "<<as::time << std::time(0) <<endl;


    return a.exec();
}

Bei der Ausgabe erhalten wir das Ergebnis, wie im Bild unten. Wenn Sie mit der Definition der Locale spielen, also statt „en_US.UTF-8“ „ru_RU.UTF-8“ schreiben, werden Sie feststellen, dass Datum und Uhrzeit das Format allerdings ebenso ändern wie das Währung.

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

D
  • 2. November 2023 03:41

С CMake всё на много проще:
find_package(Boost)

J
  • 15. Dezember 2023 06:43
  • (bearbeitet)

Евгений, здравствуйте! Сделал аналогично вашим рекомендациям, но не может связать файлы. В чём может быть причина?

Evgenii Legotckoi
  • 15. Dezember 2023 09:46

Добрый день! У вас в про файле в строке LIBS += явно не хватает пробела, посмотрите внимательно на свой код и на пример.

J
  • 15. Dezember 2023 10:08
  • (bearbeitet)

Евгений, благодарю: с тем вопросом разобрался. Но никак не могу разобрать уже другую

Нашёл пару советов в форуме Qt и stackoverflow, но не понимаю как их реализовать тут. К примеру:

В Asio должна быть ссылка на дополнительные библиотеки. Добавьте в свой LIBS +=
1.) Boost_system: -LC:/path/to/boost/libs и -llibboost_system-mgw48-mt-1_52
2.) В Windows, WS2_32.lib: -LC:/path/to/winsock2/lib и -lWS2_32

https://forum.qt.io/topic/53532/solved-qt-and-boost-cannot-find-llibboost_filesystem/4

Не очень понимаю как реализовать вторую рекомендацию

Evgenii Legotckoi
  • 15. Dezember 2023 11:07

По существу выглядит так, что нужно добавить ещё одну строку;

LIBS += -LC:/path/to/winsock2/lib -lWS2_32

Вот только у вас ещё должна быть эта библиотека winsock2 скачана и находится по этому пути. Но я с таким не сталивался в принципе.

G
  • 18. Dezember 2023 21:01

Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.

Kommentare

Nur autorisierte Benutzer können Kommentare posten.
Bitte Anmelden oder Registrieren
Letzte Kommentare
ИМ
Игорь Максимов5. Oktober 2024 07:51
Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas55. Juli 2024 11:02
QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssr8. Februar 2024 18:43
Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
EVA
EVA25. Dezember 2023 10:30
Boost - statisches Verknüpfen im CMake-Projekt unter Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
Jetzt im Forum diskutieren
J
JacobFib17. Oktober 2024 03:27
добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
JW
Jhon Wick1. Oktober 2024 15:52
Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
КГ
Кирилл Гусарев27. September 2024 09:09
Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
F
Fynjy22. Juli 2024 04:15
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

Folgen Sie uns in sozialen Netzwerken