Форум программистов, компьютерный форум, киберфорум
Наши страницы
Boost C++
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.92/37: Рейтинг темы: голосов - 37, средняя оценка - 4.92
cyberdiem
74 / 25 / 2
Регистрация: 15.02.2012
Сообщений: 97
1

Компиляция библиотеки boost с использованием mingw под винду

14.07.2012, 17:29. Просмотров 6948. Ответов 13
Метки нет (Все метки)

В общем-то возникла следующая задача: прикрутить boost к С++ для работы с модулем asio (среда Qt c мингвой 4.4 собственно)
Почитал несколько гайдов, везде твердится одно и то же примерно: компильните библиотеку под свою операционку и потом в среде в .pro файле проекта пропишите пути к хедерам и скомпилировавшимся в новой папке stage\lib либинам. Для этого сначала компилировал bjam: нашел в скаченных дистрибутивах батничек bootstrap.bat, в нем добавил
C++ (Qt)
1
2
3
4
5
SET MINGWDIR=C:\QtSDK\mingw\bin
SET BOOSTDIR=C:\boost_distr\boost_1_46_1
SET PATH=%MINGWDIR%;PATH
/*----------------*/
call .build.bat gcc> ......bjam.log
Все сохранил, запустил с консольки и вуаля bjam собрался. Потом перешел непосредственно к сборке буста, создал батник с таким содержанием:
C++ (Qt)
1
2
3
4
5
6
7
8
@echo off
SET MINGWDIR=C:\QtSDK\mingw\bin
SET BOOSTDIR=C:\boost_distr\boost_1_46_1
 
SET PATH=%BOOSTDIR%;%MINGWDIR%;PATH
CD %BOOSTDIR%
bjam.exe --build-dir=%BOOSTDIR% toolset=gcc --build-type=complete stage
@pause
Соответственно долго-долго-долго ждал пока процесс сборки завершится, ждал фейлов - недождался, все гладко прошло. Далее, радостный, в профайл проекта залил:
C++ (Qt)
1
2
3
4
5
6
7
8
INCLUDEPATH += c:/boost_libs/boost
LIBS += -Lc:/boost_libs/lib -llibboost_system-mgw44-1_46_1 -llibboost_thread-mgw44-mt-d-1_46_1
 
win32:LIBS += -lsetupapi
win32:LIBS += -lwsock32
win32:LIBS += -lws2_32
 
win32:DEFINES += _WIN32_WINNT=0x0501
На счет последних 4 строчек - это точно так, не раз находил по этому пункту инфу, везде говорят, что нужно, если юзаешь модуль asio (который мне и нужен).

А вот сам вопрос относится к первым двум строчкам:
1) В инклуд заносим путь к хедерам (которые изначально хранятся в папке дистрибутивов boost'а: C:\boost_distr\boost_1_46_1\boost, но я их перенес в отдельную папку C:\boost_libs\boost), однако когда я пытаюсь собрать проект с таким вариантом пути то получаю следующий набор ошибок:
Компиляция библиотеки boost с использованием mingw под винду

Но на одном форуме я нашел вариант другого пути в инклуде:
C++ (Qt)
1
INCLUDEPATH += c:/boost_libs
И итоги оказались уже другими:
Компиляция библиотеки boost с использованием mingw под винду
, причем последние 2 эррора как то странно "выскакивают", т.е. один раз попытался собрать - выскочили, очистил проект, стал пересобирать - собралось, остались только варнинги.
Так вот, поидее отличие заключается лишь в том, что путь к хедерам в первом случае указан с точностю до последней папки - но мы получаем тучу эрроров, а во втором на уровень повыше папка - и уже 2 эррора - вроде бы пооптимистичнее. Объясните, пожалуйста, в чем разница тут будет и как единственно правильно? и если можно, поясните природу ошибок.

2) По-поводу второй строчки, опять же было два варианта:
а)
C++ (Qt)
1
LIBS += -Lc:/boost_libs/lib -llibboost_system-mgw44-1_46_1 -llibboost_thread-mgw44-mt-d-1_46_1
, где подгружаем 2 либы (путь опять перенес из C:\boost_distr\boost_1_46_1\stage\lib в c:\boost_libs\lib)
б)
C++ (Qt)
1
LIBS += c:/boost_libs/lib/libboost_system-mgw44.lib
, где подгружаем 1 основную либу

Вот тут-то я и оторопел: у меня в stage\lib создались dll'ки, а не lib'ы!!! И теперь я в недооумении, вообще правильно ли я скомпилировал boost... откуда там dll? Прошу тут пояснить, как же все-таки должно быть: lib или dll файлы?.

Заранее всем спасибо!

З.Ы.: тема - мой копипаст с раздела по Qt, но там тишина, надеюсь хоть тут мне ответят: вроде бы буст не первый раз обсуждается, должны тут люди быть с ним знакомы
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.07.2012, 17:29
Ответы с готовыми решениями:

Ошибка при компиляции с использованием библиотеки boost
Всем привет. Написал код. В самой студии ничего красным не подсвечивает, ошибок нет. Как только...

Где взять библиотеки boost под 64-битный проект?
Щас начал изучать создание 64 битных программ. Но при использовании библиотеки boost выводит...

Ошибка со сборкой Boost с MinGW
Стараюсь собрать библеотеку Boost. Использую компилятор MinGW w64. При сборке получаю ошибку...

Компиляция и установка Boost
Помогите установить. Проковырявший 3 часа ничего так и не получилось. Скачал утилиту bjam.exe....

Компиляция boost 1.54 на Windows 8
Добрый день. Встал вопрос по поводу компиляции буст. Через bootstrap.bat ничего не компилится.

13
niXman
Эксперт С++
3206 / 1455 / 73
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
14.07.2012, 20:40 2
для bjam`а укажи еще '--prefix=path_for_install' и 'install'.
т.е. получиться должно это: bjam.exe --build-dir=%BOOSTDIR% toolset=gcc --build-type=complete stage --prefix=path_for_install install

Добавлено через 2 минуты
Цитата Сообщение от cyberdiem Посмотреть сообщение
откуда там dll?
добавь еще 'link=static' и 'runtime-link=static'
1
cyberdiem
74 / 25 / 2
Регистрация: 15.02.2012
Сообщений: 97
14.07.2012, 20:48  [ТС] 3
niXman, спасибо, буду пробывать. А что на счет путей? указывать к хедерам или все таки повыше на папочку?

Добавлено через 6 минут
Цитата Сообщение от niXman Посмотреть сообщение
добавь еще 'link=static' и 'runtime-link=static'
это тоже в конце bjam.exe? т.е. будет так?:
bjam.exe --build-dir=%BOOSTDIR% toolset=gcc --build-type=complete stage --prefix=path_for_install install --link=static --runtime-link=static

и что дает --prefix=path_for_install install?
0
niXman
Эксперт С++
3206 / 1455 / 73
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
14.07.2012, 21:03 4
Цитата Сообщение от cyberdiem Посмотреть сообщение
что на счет путей?
при использовании опции 'install' и указании '--prefix=m', bjam проинсталлит хидеры в 'path_for_install/include/boost' а либы в 'path_for_install/lib'
таким образом, в опциях проекта тебе нужно указать путь к хидерам как: INCLUDEPATH += path_for_install/include
а к либам как: LIBS += -Lpath_for_install/lib

в своем коде, в любом случае нужно юзать относительный путь к хидерам boost. т.е.: #include <boost/asio/io_service.hpp>

Добавлено через 4 минуты
Цитата Сообщение от cyberdiem Посмотреть сообщение
будет так?
да. проверить сейчас немогу.

Цитата Сообщение от cyberdiem Посмотреть сообщение
и что дает --prefix=path_for_install
префикс для установки указывает же

install - указывает на то, что нужно произвести не только сборку boost, но и установку в указанный префикс.

еще есть опции '--libdir=m' и '--includedir=m'. надеюсь, по названию понятно что они выполняют

Добавлено через 4 минуты
я, вообще, для винды, использую такую команду: bjam -j4 toolset=gcc variant=release threading=multi link=static runtime-link=static --without-mpi --without-math --without-random --without-graph --without-graph_parallel --without-python --without-wave --layout=system --libdir=%MINGWDIR%/x86_64-w64-mingw32/lib --includedir=%MINGWDIR%/x86_64-w64-mingw32/include install

за описанием ключей - в гугл.
1
14.07.2012, 21:03
cyberdiem
74 / 25 / 2
Регистрация: 15.02.2012
Сообщений: 97
14.07.2012, 21:37  [ТС] 5
Все впринципе понятно, но что тогда делает build-type=complete stage? Если я правильно понял, то нам нужно stage заменить на install и перед этим указать папки, куда все будет собираться(этим и отличается install от stage): либо одну общую с помощью --prefix=m, либо отдельно для хэдеров и отдельно для либ через "--includedir=m"&"--libdir=m". Это мои догадки)

Цитата Сообщение от niXman Посмотреть сообщение
в своем коде, в любом случае нужно юзать относительный путь к хидерам boost. т.е.: #include <boost/asio/io_service.hpp>
на счет этого вкурсе, но все равно спасибо)

Цитата Сообщение от niXman Посмотреть сообщение
threading=multi
- для многопоточности нужна (разве недостаточно указать -j4)?
и от чего зависит на сколько потоков можно разбивать? просто у кого то 2 видел, а у вас вот 4...
Просто еще пока плохо разбираюсь в системе ключей, а спросить про один-два ключика думаю позволительно
0
niXman
Эксперт С++
3206 / 1455 / 73
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
14.07.2012, 21:47 6
Цитата Сообщение от cyberdiem Посмотреть сообщение
но что тогда делает build-type=complete stage?
по правде сказать - не знаю. не припомню чтоб когда-то ее использовал.

Цитата Сообщение от cyberdiem Посмотреть сообщение
(разве недостаточно указать -j4)?
нет.
'-jN' всего лишь указывает bjam`у что сборку нужно производить в N потоков, а не поддержку бустом многопоточности.

Цитата Сообщение от cyberdiem Посмотреть сообщение
и от чего зависит на сколько потоков можно разбивать?
от кол-ва ядер на машине.
1
cyberdiem
74 / 25 / 2
Регистрация: 15.02.2012
Сообщений: 97
14.07.2012, 21:49  [ТС] 7
ну значит все точки над i расставлены) спасибо за все советы и терпеливые пояснения, буду пробывать! если что, еще спрошу
0
cyberdiem
74 / 25 / 2
Регистрация: 15.02.2012
Сообщений: 97
16.07.2012, 01:34  [ТС] 8
niXman, вот уже 2 дня пытаюсь скомпилировать буст, но не получаю нужного результата.
Сначала спрошу кое что:
1) в результате компилирования (--prefix=boost_finish) получаю в папке с либами файлы расширения ".а", причем тут эти файлы или так и должно быть (логично же, что lib?)?

2) уже натыкался на подобную проблему тут на просторах киберфорума, но что-то никто не дал полноценного ответа (да ну или хоть какого-нибудь вообще): у меня компилятся библиотеки, но не все! (в частности злополучный так нужный мне .asio) как мне поступить? причем самое удивительное, что когда я взял буст 1_46_1 (старенький уже) и впервые скомпилил его (там где у меня вылезли dll'ки), то там были все либы! Сечас вот пробывал сделать то же самое(в батнике те же самые ключи были в точности) и бах - уже не все скомпилировались(
Вот список тех, что поддались компилированию:
- date_time : building
- filesystem : building
- graph : building
- graph_parallel : building
- iostreams : building
- math : building
- mpi : building
- program_options : building
- python : building
- random : building
- regex : building
- serialization : building
- signals : building
- system : building
- test : building
- thread : building
- wave : building

Почти один в один список как вот в этой теме, но там я ответа не нашел для себя к сожалению. Подскажите пожалуйста, что делать?

Если что пробывал собирать вот так:
1) bjam.exe -j2 toolset=gcc variant=release threading=multi link=static runtime-link=static --layout=system --prefix=boost_finish install
2) bjam.exe -j2 --build-dir=%BOOSTDIR% toolset=gcc threading=multi --variant=release link=static runtime-link=static --build-type=complete stage

итог - одинаковый: неполные библиотеки(

Заранее спасибо!)

Добавлено через 15 минут
И еще кое что: я понимаю, что гугл всемогущ, но я совсем зашиваюсь и устал от поисков, может вы мне поясните в двух словах следующие ключи, чтобы я мог понять, что действительно мне необходимо, а что необязательно: threading=multi, link=static, runtime-link=static, --layout=system, и то что в конце я писал stage, а вы посоветовали install. (остальное понимаю)

Вообще я думал, что:
threading=multi - для многопоточности сборки, чтобы -jN работало;
link=static, runtime-link=static - для того чтобы библиотеки компилились в lib, а не dll (чего кстати не произошло почему-то, поэтому и спрашиваю подробнее);
0
niXman
Эксперт С++
3206 / 1455 / 73
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
16.07.2012, 13:58 9
Цитата Сообщение от cyberdiem Посмотреть сообщение
получаю в папке с либами файлы расширения ".а", причем тут эти файлы или так и должно быть (логично же, что lib?)?
так и должно быть =)
gcc/mingw используют .a в качестве расширения для библиотек.

Цитата Сообщение от cyberdiem Посмотреть сообщение
у меня компилятся библиотеки, но не все! (в частности злополучный так нужный мне .asio) как мне поступить?
ну дык. хидер-онли библиотеки компилироваться не могут. на то они и хидер-онли.

Цитата Сообщение от cyberdiem Посмотреть сообщение
что когда я взял буст 1_46_1 (старенький уже) и впервые скомпилил его (там где у меня вылезли dll'ки), то там были все либы!
а тут поподробней.

Цитата Сообщение от cyberdiem Посмотреть сообщение
threading=multi
заявляет поддержку multithreading для собранных библиотек.

Цитата Сообщение от cyberdiem Посмотреть сообщение
link=static
заставляет собирать статические либы, а не динамические.

Цитата Сообщение от cyberdiem Посмотреть сообщение
runtime-link=static
заставляет прилинковывать статическую CRT если это возможно.

Цитата Сообщение от cyberdiem Посмотреть сообщение
--layout=system
заставляет использовать имена библиотек согласно GNU принципу именования библиотек.
1
cyberdiem
74 / 25 / 2
Регистрация: 15.02.2012
Сообщений: 97
16.07.2012, 14:21  [ТС] 10
Цитата Сообщение от niXman Посмотреть сообщение
ну дык. хидер-онли библиотеки компилироваться не могут. на то они и хидер-онли.
как это понять? т.е. то что в исходных дистрибутивах есть касательно asio, то так оно и останется и компиляции не подвергнется? странно как то... в первый раз же у меня появлялись dll'ки для asio...

Цитата Сообщение от niXman Посмотреть сообщение
а тут поподробней.
ну я уже говорил: впервые пробывал собирать буст по схеме которую описал в первом сообщении. Делал это на бусте 1.46.1, а исполняющая строка в батнике была вот эта bjam.exe --build-dir=%BOOSTDIR% toolset=gcc --build-type=complete stage
В результате получилось 2 папки в корне boost_1_46_1: stage с файлами рассширения .dll, .a, .o в разных вариантах (дебаг-релиз вроде) для всех возможных модулей буста, и папка b.v2 вроде так, в ней тоже были эти же файлы только расфасованные по папкам. Вот так(
0
niXman
Эксперт С++
3206 / 1455 / 73
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
16.07.2012, 18:31 11
Цитата Сообщение от cyberdiem Посмотреть сообщение
так оно и останется и компиляции не подвергнется?
именно.

Цитата Сообщение от cyberdiem Посмотреть сообщение
в первый раз же у меня появлялись dll'ки для asio
неможет такого быть.
1
cyberdiem
74 / 25 / 2
Регистрация: 15.02.2012
Сообщений: 97
16.07.2012, 19:41  [ТС] 12
Цитата Сообщение от niXman Посмотреть сообщение
неможет такого быть.
эх, жаль, что я снес ту папку, осталось бы сделал бы скрин(

Цитата Сообщение от niXman Посмотреть сообщение
именно.
А откуда тогда эта библиотека вообще возьмется? все что я по ней буду иметь это хедеры и какие то исходные файлы, о которых я пока понятия не имею... Ладно сейчас еще раз попробую все аккуратно скомпилировать и прописать в проекте, посмотрим, что выйдет. Позже отпишусь.

З.Ы. благодаря многопоточности и исключениям компилирования некоторых библиотек, все собирается за 10-15 минут, а не за 2 часа, спасибо за наводки
0
niXman
Эксперт С++
3206 / 1455 / 73
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
16.07.2012, 20:49 13
Цитата Сообщение от cyberdiem Посмотреть сообщение
сделал бы скрин
не сделал бы.

Цитата Сообщение от cyberdiem Посмотреть сообщение
А откуда тогда эта библиотека вообще возьмется?
уже отвечал: header-only.
1
cyberdiem
74 / 25 / 2
Регистрация: 15.02.2012
Сообщений: 97
17.07.2012, 01:58  [ТС] 14
Цитата Сообщение от niXman Посмотреть сообщение
уже отвечал: header-only.
О, все ясно) черным по белому написано) спасибо!) Выходит, что я 100 раз компилировал правильно, а думал, что получалось неправильно... теперь лишь бы в проекте все хорошо сложилось

Добавлено через 1 час 54 минуты
Все собрал, все работает и находит! Спасибо огромное за помощь!

Теперь при компиляции проекта выскакивает ряд ошибок связанный с error_code.hpp и error.hpp, вот лог:
c:\boost_distr\boost_1_46_1\boost_finish\include\boost\system\error_code.hpp:214: ошибка: undefined reference to `boost::system::generic_category()'
c:\boost_distr\boost_1_46_1\boost_finish\include\boost\system\error_code.hpp:215: ошибка: undefined reference to `boost::system::generic_category()'
c:\boost_distr\boost_1_46_1\boost_finish\include\boost\system\error_code.hpp:216: ошибка: undefined reference to `boost::system::generic_category()'
c:\boost_distr\boost_1_46_1\boost_finish\include\boost\system\error_code.hpp:315: ошибка: undefined reference to `boost::system::generic_category()'
c:\boost_distr\boost_1_46_1\boost_finish\include\boost\asio\error.hpp:220: ошибка: undefined reference to `boost::system::system_category()'
:-1: ошибка: collect2: ld returned 1 exit status
Вот код, брал его тут
Прикинул так, добавил #include <boost/system/error_code.hpp> и #include <boost/asio/error.hpp>, но ничего не изменилось, тот же набор ошибок. Подскажите, что не так?

Добавлено через 56 минут
Вроде нашел решение проблемы: в про-файле проекта в LIBS дописал -lboost_system. Ошибки пропали, но теперь программа просто не работает. Возможно я не понимаю сам код, но на первый взгляд все нормально. Проблема возникает на этапе считывания с экрана URL: после нажания enter ничего не происходит... Вот код если что:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <iostream>
#include <fstream>
#include <istream>
#include <ostream>
#include <string>
#include <boost/asio.hpp>
 
using boost::asio::ip::tcp;
 
int main()
{
    std::locale::global(std::locale(""));
    try
    {
        std::cout << "Enter URL(example: [url]www.cyberforum.ru):[/url] ";
        std::string URL;// = "www.cyberforum.ru";
        std::getline(std::cin, URL, '\n');
 
        boost::asio::io_service io_service;
 
        tcp::resolver resolver(io_service);
        tcp::resolver::query query(URL, "http");
        tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
        tcp::resolver::iterator end;
 
        tcp::socket socket(io_service);
        boost::system::error_code error = boost::asio::error::host_not_found;
        while (error && endpoint_iterator != end)
        {
            socket.close();
            socket.connect(*endpoint_iterator++, error);
        }
        if (error)
            throw boost::system::system_error(error);
 
        boost::asio::streambuf request;
        std::ostream request_stream(&request);
        request_stream << "GET / HTTP/1.0\r\n"
                       << "Host: " + URL + "\r\n"
                       << "Accept: text/html\r\n"
                       << "Connection: close\r\n\r\n";
 
        boost::asio::write(socket, request);
        boost::asio::streambuf response;
        boost::asio::read_until(socket, response, "\r\n");
 
        std::istream response_stream(&response);
        std::string header;
        while (std::getline(response_stream, header) && header != "\r");
 
        std::ofstream file("web_source.txt");
        if(!file)
            throw std::runtime_error("Cannot create file");
 
        while (boost::asio::read(socket, response, boost::asio::transfer_at_least(1), error))
        {
            file << &response;
        }
        if (error != boost::asio::error::eof)
            throw boost::system::system_error(error);
 
        std::cout << "Done!\n";
        std::getchar();
    }
    catch (std::exception& e)
    {
        std::cout << "Exception: " << e.what();
        std::getchar();
    }
    return 0;
}
Если будут идеи, приятно было бы выслушать их)

Добавлено через 1 час 29 минут
И опять нашел в чем проблема: в QtCreator в окне вывода приложения не поддерживается судя по всему cin... Если ставить галку в настройках запуска проекта напротив "Запускать в терминале", то терминал и правда появляется, но зависает и программа заканчивает работу, вот такие дела. Так что я думаю тему можно закрыть, все что я хотел по ней узнал. Продолжу в разделе по Qt. Спасибо большое niXman еще раз.

Добавлено через 34 минуты
Ну и напоследок нашёл решение последней проблемы: просто в коде надо cout заменить на cerr, а в про-файле проекта дописать CONFIG += console
0
17.07.2012, 01:58
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.07.2012, 01:58

Компиляция boost library
Здравствуйте! Подскажите пожайлуста, как нужно компилировать boost, чтобы были скомпилированы все...

Boost и компиляция огромного проекта
Приветствую! Есть 3 таких вопроса: 1. Интересует русская инструкция по установки boost, сам я не...

Компиляция примера boost.asio
Не могу скомпилировать первый пример из темы http://www.cyberforum.ru/faq/thread317829.html ....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru