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:
- QtBoostHello.pro
- 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.
С CMake всё на много проще:
find_package(Boost)
Евгений, здравствуйте! Сделал аналогично вашим рекомендациям, но не может связать файлы. В чём может быть причина?
Добрый день! У вас в про файле в строке LIBS += явно не хватает пробела, посмотрите внимательно на свой код и на пример.
Евгений, благодарю: с тем вопросом разобрался. Но никак не могу разобрать уже другую
Нашёл пару советов в форуме 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
Не очень понимаю как реализовать вторую рекомендацию
По существу выглядит так, что нужно добавить ещё одну строку;
Вот только у вас ещё должна быть эта библиотека winsock2 скачана и находится по этому пути. Но я с таким не сталивался в принципе.
Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.