Russian Qt Forum
Ноябрь 23, 2024, 04:36 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: QtCreator + Boost  (Прочитано 22367 раз)
Lagovas
Гость
« : Июль 29, 2011, 17:14 »

Помогите подключить буст к креатору. Уже несколько дней пытаюсь, не получается, почти отчаялся. В частности не могу regex подключить. Вот как пытаюсь. Собрал регекс так
bjam --with-regex stage

Теперь .pro файл.

Код:
QT       += core

QT       -= gui

TARGET = Test
CONFIG   += console
CONFIG   -= app_bundle

TEMPLATE = app

INCLUDEPATH+="D:/EXE/C++/boost_1_46_1"

SOURCES += main.cpp

LIBS += D:/EXE/C++/boost_1_46_1/bin.v2/libs/regex/build/msvc-10.0/release/link-static/threading-multi/libboost_regex-vc100-mt-1_46_1.lib
LIBS += -LD:/EXE/C++/boost_1_46_1/bin.v2/libs/regex/build/msvc-10.0/release/link-static/threading-multi -llibboost_regex-vc100-mt-1_46_1

Пробую подключить либу 2 способами. Теперь исходник. Брал его из доки буста.

Код:
#include <boost/regex.hpp>
#include <iostream>
#include <string>

int main()
{
    std::string line;
    boost::regex pat( "^Subject: (Re: |Aw: )*(.*)" );

    while (std::cin)
    {
        std::getline(std::cin, line);
        boost::smatch matches;
        if (boost::regex_match(line, matches, pat))
            std::cout << matches[2] << std::endl;
    }
    return 0;
}

И приведу кусок из вывода ошибок, т.к. там много, и все относительно boost::re_detail

debug/main.o: In function `cpp_regex_traits_char_layer':
d:/EXE/C++/boost_1_46_1/boost/regex/v4/cpp_regex_traits.hpp:366: undefined reference to `boost::re_detail::cpp_regex_traits_char_layer<char>::init()'
debug/main.o:d:/EXE/C++/boost_1_46_1/boost/regex/v4/regex_raw_buffer.hpp:131: undefined reference to `boost::re_detail::raw_storage::resize(unsigned int)'
debug/main.o: In function `save_state_init':
d:/EXE/C++/boost_1_46_1/boost/regex/v4/perl_matcher_non_recursive.hpp:107: undefined reference to `boost::re_detail::get_mem_block()'
debug/main.o: In function `~save_state_init':
d:/EXE/C++/boost_1_46_1/boost/regex/v4/perl_matcher_non_recursive.hpp:115: undefined reference to `boost::re_detail::put_mem_block(void*)'
debug/main.o:d:/EXE/C++/boost_1_46_1/boost/regex/v4/perl_matcher_common.hpp:206: undefined reference to `boost::re_detail::verify_options(unsigned int, boost::regex_constants::_match_flags)'
debug/main.o:d:/EXE/C++/boost_1_46_1/boost/regex/v4/perl_matcher_non_recursive.hpp:1117: undefined reference to `boost::re_detail::put_mem_block(void*)'
debug/main.o:d:/EXE/C++/boost_1_46_1/boost/regex/pattern_except.hpp:75: undefined reference to `boost::re_detail::raise_runtime_error(std::runtime_error const&)'
debug/main.o:d:/EXE/C++/boost_1_46_1/boost/regex/v4/basic_regex_parser.hpp:218: undefined reference to `boost::regex_error::regex_error(std::string const&, boost::regex_constants::error_type, int)'


И конец вывода:

debug/main.o:d:/EXE/C++/boost_1_46_1/boost/regex/pending/object_cache.hpp:75: undefined reference to `boost::scoped_static_mutex_lock::~scoped_static_mutex_lock()'
debug/main.o:d:/EXE/C++/boost_1_46_1/boost/regex/pending/object_cache.hpp:75: undefined reference to `boost::scoped_static_mutex_lock::~scoped_static_mutex_lock()'
debug/main.o:d:/EXE/C++/boost_1_46_1/boost/regex/v4/cpp_regex_traits.hpp:625: undefined reference to `boost::re_detail::lookup_default_collate_name(std::string const&)'
debug/main.o:d:/EXE/C++/boost_1_46_1/boost/regex/v4/cpp_regex_traits.hpp:667: undefined reference to `boost::re_detail::raise_runtime_error(std::runtime_error const&)'
debug/main.o:d:/EXE/C++/boost_1_46_1/boost/regex/v4/cpp_regex_traits.hpp:682: undefined reference to `boost::re_detail::get_default_error_string(boost::regex_constants::error_type)'
debug/main.o:d:/EXE/C++/boost_1_46_1/boost/regex/v4/cpp_regex_traits.hpp:1051: undefined reference to `boost::scoped_static_mutex_lock::scoped_static_mutex_lock(boost::static_mutex&, bool)'
debug/main.o:d:/EXE/C++/boost_1_46_1/boost/regex/v4/cpp_regex_traits.hpp:1054: undefined reference to `boost::scoped_static_mutex_lock::~scoped_static_mutex_lock()'
debug/main.o:d:/EXE/C++/boost_1_46_1/boost/regex/v4/cpp_regex_traits.hpp:1054: undefined reference to `boost::scoped_static_mutex_lock::~scoped_static_mutex_lock()'
collect2: ld returned 1 exit status
mingw32-make[1]: *** [debug\Test.exe] Error 1
mingw32-make: *** [debug] Error 2
Процесс «D:\QtSDK\mingw\bin\mingw32-make.exe» завершился с кодом 2.
Возникла ошибка при сборке проекта Test (цель: Desktop)
Во время выполнения сборки на этапе «Сборка»


В общем помогите плз. Заранее благодарен.

П.С. Кстати, вопрос на засыпку. Что есть в бусте, чего нет в Qt? Все это задумывалось из за регулярок, но вот увидел, что есть регулярки в Qt. Так интересно, что лучше и все ли покрывает Qt, что есть в бусте?

П.С. Всем спасибо за быстрое реагирование, решил. Надо было подключать boost\stage\lib.
Вопрос на засыпку. Я собрал проект, но в Release папке не было длл. Можно ли как то сделать, что бы при сборке, креатор кидал туда все либы которые нужны для проги?
И все же хотелось бы так же узнать ответ по поводу boost и qt и как еще можно подключать dll из креатора не написанием LIB, а с помощью GUI? Я когда правой кнопкой в редакторе файла .pro нажимаю и выбираю добавить либы, без разницы, выбираю статическую или динамическую, при выборе файла стоит фильтр на .lib. И длл попросту выбрать не могу. Ничего кроме .lib, а ведь mingw вроде их компилит в другом расширении, в .a кажется. Есть решение? Это баг креатора?
« Последнее редактирование: Июль 29, 2011, 19:45 от Lagovas » Записан
alex312
Хакер
*****
Offline Offline

Сообщений: 606



Просмотр профиля
« Ответ #1 : Июль 29, 2011, 19:24 »

Рабочий проект(смотреть вложения).
Компилятор : msvc-2008

P.S. В Qt тоже есть регулярки
« Последнее редактирование: Июль 29, 2011, 19:39 от alex312 » Записан
alex312
Хакер
*****
Offline Offline

Сообщений: 606



Просмотр профиля
« Ответ #2 : Июль 30, 2011, 10:16 »

Что лучше boost или Qt - спорить и что-то утверждать неправильно в принципе.
С boost не сильно знаком, поэтому скажу чего там нет, это:
 - средств(классов) для построения GUI;
 - классов работы с базами данных;
 - Web движка;
 - встраиваемого скриптового языка;
 - не решена работа со строками и unicode;

Но и в boost есть чем похвастатся :
 - библиотека работы с графами
 - библиотеки нестандартных контейнеров
 - различные математические библиотеки

Так что есть из чего выбирать  Строит глазки
Записан
Fess
Гость
« Ответ #3 : Июль 30, 2011, 17:21 »

П.С. Кстати, вопрос на засыпку. Что есть в бусте, чего нет в Qt? Все это задумывалось из за регулярок, но вот увидел, что есть регулярки в Qt. Так интересно, что лучше и все ли покрывает Qt, что есть в бусте?
В Qt есть _все_, что нужно для построения среднестатистического приложения. Из того, что есть в бусте, но нет в Qt нет ничего сверх необходимого, а аналоги можно найти и не только в бусте. Не используйте буст в Qt проекте пока он вам _действительно_ не понадобится.
Вопрос на засыпку. Я собрал проект, но в Release папке не было длл.
Буст использует статические библиотеки, которые линкуются прямо в ваш исполняемый файл. Это же является его большим минусом (с моей точки зрения). Ваш проект начинает на порядок медленнее компилироваться и линковаться. Плюс, буст напичкан шаблонами, которые скорости сборки, мягко говоря, не добавляют.
Можно ли как то сделать, что бы при сборке, креатор кидал туда все либы которые нужны для проги?
Креатор может кидать то, что сам собирает в папку DESTDIR. Насколько я знаю, с зависимостями так не выйдет.
И все же хотелось бы так же узнать ответ по поводу boost и qt и как еще можно подключать dll из креатора не написанием LIB, а с помощью GUI? Я когда правой кнопкой в редакторе файла .pro нажимаю и выбираю добавить либы, без разницы, выбираю статическую или динамическую, при выборе файла стоит фильтр на .lib. И длл попросту выбрать не могу. Ничего кроме .lib, а ведь mingw вроде их компилит в другом расширении, в .a кажется. Есть решение? Это баг креатора?
Указать библиотеку в LIBS единственно-правильный способ. Любой GUI мастер сделает то же самое. Напрямую редактировать файлы проекта гораздо лучше, чем пользоваться GUI. Вы будете лучше понимать что происходит на самом деле, получите необходимую гибкость в настройке и не будете зависеть от какой-либо IDE.

ЗЫ: библиотеки буста обычто лежат в boost_1_46_1/stage/lib build вам не нужен, можете его просто удалить.
« Последнее редактирование: Июль 30, 2011, 17:35 от Fess » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Июль 30, 2011, 17:30 »

Из того, что есть в бусте, но нет в Qt нет ничего сверх необходимого, а аналоги можно найти и не только в бусте.
Прошу показать аналог http://www.boost.org/doc/libs/1_47_0/libs/polygon/doc/index.htm
Записан
Fess
Гость
« Ответ #5 : Июль 30, 2011, 19:09 »

Согласитесь, это не предмет первой необходимости. Охотно вам верю (хотя не проверял), что нигде более нет аналогов этой библиотеки, но это лишь значит, что она достаточно узконаправленная и нужна не всем и не всегда.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Июль 31, 2011, 01:04 »

Согласитесь, это не предмет первой необходимости.
"Необходимость" и "частота использования" - разные вещи Улыбающийся Возможно задача потребуется всего 1 раз (и никогда больше) - но необходимость в ее решении может быть огромной. А вообще согласен с Вами что просто так поиграться с бустом - особого смысла не видно.
Записан
dimen
Гость
« Ответ #7 : Июль 31, 2011, 04:56 »

надо добавить system, thread, pthread либы чтобы слинковалось...
при использовании qt буст нафиг не впился!
Записан
Lagovas
Гость
« Ответ #8 : Август 01, 2011, 01:34 »

Пишу приложение для копирования файлов или разархивация и переименовывание. Нужно было использовать регулярные выражения. Попробовал QRegExp, не сработал. Я попробовал на питоне, работает. Подключил буст, работает. Пример ниже скину. Нужно было скопировать файл, чуток не разобрался как. Есть QFile::copy(QString& filename). И тут вопрос, filename это название файла или полный его путь? Пробовал полный путь, чет не проканало, а в доке не нашел примера. Кто может показать пример как копировать в кьюте и перемещать тоже не помешало бы.
По поводу QRegExp. Мне надо было вытащить USERPROFILE из environ. Я сначало сделал QString str = QProcess::systemEnvironment().join(",") и нахожу регуляркой что мне надо, что бы не пробегать foreach (нравятся регулярки, хотя хз че быстрее будет).
Юзаю бустом такую регулярку = boost::regex xRegEx("USERPROFILE=(.+?),"); Такая же с помощью QRegExp не канала. Вроде вообще ничего не находила.
Кстати, по поводу копирования, это не упрек, а просьба помощи, т.к. с помощью boost::filesystem3 тоже не получается. Я пока учусь, так что заранее благодарен за помощь.

П.С. почему либы буста нельзя линковать динамически? ведь когда она компилит либы, то делает статику и динамику. У меня на каждую либу есть .a и .dll файл, при чем дебаг версии, релиз, мультитред и еще какая то мб. Какую лучше подключать и как указать в Qt какую конкретно, ведь либа указывается без разрешения (вроде). Конкретно писать LIBS += /path/somelib.dll ?

П.С. Еще вопросик, есть ли какой то способ проверить, закончен ли файл или нет? Например файл скачивается торрентом или менеджером закачек, который выделяет полностью память и нет в нем функции добавить суфикс к незакаченному файлу, как можно проверить завершенность?
« Последнее редактирование: Август 01, 2011, 01:48 от Lagovas » Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #9 : Август 01, 2011, 02:33 »

цопи без разницы какой путь, укажете имя - будет файл с этим именем в текущей директории (скорее всего рядом с бинарником), полный путь - создастся файл по этому пути. Бтв кьюфал::цопи юзать не совсем правильно (в вашем случае), тк вы не будете в курсе прогресса копирования.
Записан
Lagovas
Гость
« Ответ #10 : Август 01, 2011, 02:54 »

посоветуй как правильней? файлы небольшие, около 17 .png. Но все же интересно как правильней?
Если указывать путь в папку, он не копирует в папку, только если задавать путь с именем файла, только что проверял. Например f.copy("d:\\test_qt") не сработает, так же и f.copy("d:\\test_qt\\"). А вот f.copy("d:\\test_qt\test.lol")
Почему то даже f.copy("d:\\test_qt\\"+f.fileName()) не работает. Кто расчехлит?

П.С. Попробовал еще раз бустом, он выдает ошибку: Нет доступа. Я посмотрел, доступ пользователям, доверенным приложениям и тем более мне есть на чтение, запись. Добавил даже группу "Все", все равно. Кто знает в чем может трабла? При чем напостой такое в работе с файлами. Win7 professional
« Последнее редактирование: Август 01, 2011, 04:48 от Lagovas » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #11 : Август 01, 2011, 05:04 »

Почему то даже f.copy("d:\\test_qt\\"+f.fileName()) не работает.
Не связывайтесь с QFile::fileName. Действуйте через QFileInfo, этот (очень полезный) класс всегда вернет полный правильный путь. А конструкторы для QFileInfo см. в Assistant

Записан
Lagovas
Гость
« Ответ #12 : Август 01, 2011, 05:31 »

Код:
QFileInfo f("d:\\vstup.py");
QFile::copy(f.absoluteFilePath(),QDir("d:\\test_qt").absolutePath()) ? std::cout<<"ok" : std::cout<<"bad";

Вот так использовать? Всеравно не копирует. Наверное доступа нету.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #13 : Август 01, 2011, 08:14 »

По поводу QRegExp. Мне надо было вытащить USERPROFILE из environ. Я сначало сделал QString str = QProcess::systemEnvironment().join(",") и нахожу регуляркой что мне надо, что бы не пробегать foreach (нравятся регулярки, хотя хз че быстрее будет).
Юзаю бустом такую регулярку = boost::regex xRegEx("USERPROFILE=(.+?),"); Такая же с помощью QRegExp не канала. Вроде вообще ничего не находила.
Код
C++ (Qt)
QRegExp re("USERPROFILE=(.+),");
re.setMinimal(true);
QString userprofile;
if (rx.indexIn(QProcess::systemEnvironment().join(",")) > -1)
   userprofile = rx.cap(1);
а вообще, как говорится Улыбающийся
Цитировать
Если у программиста есть проблема и он думает — «Я решу ее при помощи регулярных выражений», то с этого момента у программиста уже две проблемы.

Код:
QFileInfo f("d:\\vstup.py");
QFile::copy(f.absoluteFilePath(),QDir("d:\\test_qt").absolutePath()) ? std::cout<<"ok" : std::cout<<"bad";

Вот так использовать? Всеравно не копирует. Наверное доступа нету.
надо указывать полный путь к файлу в обоих параметрах:
Код
C++ (Qt)
QFileInfo f("d:/vstup.py");
QFile::copy(f.absoluteFilePath(), QString("d:/test_qt/%1").arg(f.fileName())) ? std::cout<<"ok" : std::cout<<"bad";
и да, в Qt можно всегда пользоваться прямыми слешами независимо от платформы. если же надо вывести путь в "родном" виде, то используй функцию QDir::toNativeSeparators(). ну и конечно папка d:/test_qt должна существовать.
« Последнее редактирование: Август 01, 2011, 08:16 от kambala » Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Lagovas
Гость
« Ответ #14 : Август 01, 2011, 15:38 »

т.е. указать просто папку нельзя?
Кстати, вопрос такой. Как QRegExp::cap() узнает какую стрингу ему надо парсить, или предварительно обязал надо юзать QRegExp::indexIn()? Нет ли какой то setText или перегруженный cap с аргументом стринга?
Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.099 секунд. Запросов: 23.