Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ошибка при линковке с boost-1.44.0 
V
    Опции темы
boostcoder
Дата 24.8.2010, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



банальный код:
Код

#include <iostream>
#include <boost/thread.hpp>

void func(int time) {
    while ( --time ) {
        std::cout << "ping " << time << std::endl;
        boost::this_thread::sleep(boost::posix_time::seconds(1));
    }
}

int main() {
    boost::thread th(func, 10);
    th.join();

    return 0;
}


при компиляции с помощью mingw-gcc-4.5.1 и boost-1.44.0, линкер говорит следующее:
Цитата

D:\>g++ -O3 main.cpp -omain -lboost_system -lboost_thread
c:\temp\cc0rQreB.o:main.cpp:(.text+0x1af): undefined reference to `_imp___ZN5boost6thread12start_threadEv'
c:\temp\cc0rQreB.o:main.cpp:(.text+0x1b8): undefined reference to `_imp___ZN5boost6thread4joinEv'
c:\temp\cc0rQreB.o:main.cpp:(.text+0x1c1): undefined reference to `_imp___ZN5boost6threadD1Ev'
c:\temp\cc0rQreB.o:main.cpp:(.text+0x621): undefined reference to `_imp___ZN5boost6threadD1Ev'
c:\temp\cc0rQreB.o:main.cpp:(.text+0xa61): undefined reference to `_imp___ZN5boost11this_thread18interruptible_waitEPvNS_6detail7timeoutE'
collect2: ld returned 1 exit status


понятно, что не линкуется именно boost.thread.
при сборке этим же компилятором boost-1.43.0, все отлично линкуется.
в гугле сходу ничего не нашел.
кто-то сталкивался?
PM WWW   Вверх
bsa
Дата 24.8.2010, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



обычно, такое возникает, когда хидеры у тебя от одной версии, а либы от другой. Проверяй пути.

Добавлено через 2 минуты и 59 секунд
кстати, попробуй линковать boost_thread перед boost_system - порядок линковки тоже имеет значение.
PM   Вверх
boostcoder
Дата 24.8.2010, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(bsa @  24.8.2010,  22:42 Найти цитируемый пост)
обычно, такое возникает, когда хидеры у тебя от одной версии, а либы от другой. Проверяй пути.

да, знаю. выполнил поиск по всем жестким дискам. все почистил, поудалял.

Цитата(bsa @  24.8.2010,  22:42 Найти цитируемый пост)
кстати, попробуй линковать boost_thread перед boost_system - порядок линковки тоже имеет значение. 

тоже пробовал, в разных комбинациях.

феномем.. чесслово smile 
PM WWW   Вверх
boostcoder
Дата 25.8.2010, 04:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



нет, boost-1.44.0 упрямо не линкует thread`ы.
с версиями 1.42, 1.43 все гуд.
упоминаний о подобной проблеме в гугле не нашел. наверное первый.
PM WWW   Вверх
rudvil
Дата 25.8.2010, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 20.11.2009
Где: Latvia/Riga

Репутация: 2
Всего: 3



Аналогичная проблема, только у меня кроме вышеперечисленных ошибок ещё и это
Цитата
In file included from c:/boost_1_44_0/boost/thread/win32/thread_data.hpp:12:0,
c:/boost_1_44_0/boost/thread/win32/thread_heap_alloc.hpp:59:40: warning: inline function 'void* boost::detail::allocate_raw_heap_memory(unsigned int)' declared as  dllimport: attribute ignored
c:/boost_1_44_0/boost/thread/win32/thread_heap_alloc.hpp:69:39: warning: inline function 'void boost::detail::free_raw_heap_memory(void*)' declared as  dllimport: attribute ignored

Видимо придется возвращаться, на 1_43_0.
з.ы. GCC 4.5.0

Это сообщение отредактировал(а) rudvil - 25.8.2010, 10:50
--------------------
xor
PM MAIL Skype   Вверх
bsa
Дата 25.8.2010, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



boostcoder, пересобери boost-1.44
PM   Вверх
boostcoder
Дата 25.8.2010, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



rudvil, покажи вывод "gcc -v"

bsa, пересобирал не раз. говорю же, с предыдущими версиями все гуд.
PM WWW   Вверх
rudvil
Дата 25.8.2010, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 20.11.2009
Где: Latvia/Riga

Репутация: 2
Всего: 3



Цитата(boostcoder @ 25.8.2010,  11:29)
rudvil, покажи вывод "gcc -v"

Цитата

C:\Users\rudvil>gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=c:/mingw/bin/../libexec/gcc/mingw32/4.5.0/lto-wrapper.exe
Target: mingw32
Configured with: ../../gcc-4.5.0/configure --prefix=/mingw --build=mingw32 --ena
ble-languages=c,ada,c++,fortran,objc,obj-c++ --disable-nls --disable-win32-regis
try --enable-libgomp --disable-werror --enable-threads --disable-symvers --enabl
e-cxx-flags='-fno-function-sections -fno-data-sections' --enable-fully-dynamic-s
tring --enable-libstdcxx-debug --enable-version-specific-runtime-libs --with-pkg
version=tdm-1 --enable-sjlj-exceptions --with-bugurl=http://tdm-gcc.tdragon.net/
bugs
Thread model: win32
gcc version 4.5.0 (tdm-1)

--------------------
xor
PM MAIL Skype   Вверх
boostcoder
Дата 25.8.2010, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(rudvil @  25.8.2010,  11:36 Найти цитируемый пост)
gcc version 4.5.0 (tdm-1)

с этой сборкой тоже проверял.
PM WWW   Вверх
rudvil
Дата 26.8.2010, 13:18 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 20.11.2009
Где: Latvia/Riga

Репутация: 2
Всего: 3



Видимо проблема только с статическим libboost_thread-mgw45-mt-1_44.a
Пересобрал thread с ключами
Цитата
bjam toolset=gcc --with-thread runtime-link=shared link=shared

и подключил libboost_thread-mgw45-mt-1_44.dll.a, и положив рядом с *.exe libboost_thread-mgw45-mt-1_44.dll, все заработало.
Цитата
g++ main.cpp -omain -llibboost_thread-mgw45-mt-1_44.dll.a

Даже "system" подключать не нужно.


Это сообщение отредактировал(а) rudvil - 26.8.2010, 13:20
--------------------
xor
PM MAIL Skype   Вверх
boostcoder
Дата 26.8.2010, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(rudvil @  26.8.2010,  13:18 Найти цитируемый пост)
Видимо проблема только с статическим

возможно. вечером попробую.
PM WWW   Вверх
rudvil
Дата 27.8.2010, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 20.11.2009
Где: Latvia/Riga

Репутация: 2
Всего: 3



UPD:
У MSVC 2010 проблем нету, все в порядке.
Цитата

libboost_date_time-vc100-mt-gd-1_44.lib
libboost_thread-vc100-mt-gd-1_44.lib

Работает со статической библ., правда ещё и date_time просит, но это не существенно.
--------------------
xor
PM MAIL Skype   Вверх
boostcoder
Дата 27.8.2010, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(rudvil @  26.8.2010,  13:18 Найти цитируемый пост)
Видимо проблема только с статическим libboost_thread-mgw45-mt-1_44.a

да. именно так.

Цитата(rudvil @  27.8.2010,  12:27 Найти цитируемый пост)
У MSVC 2010 проблем нету

не использую микрософткомпилер.
PM WWW   Вверх
rudvil
Дата 18.10.2010, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 20.11.2009
Где: Latvia/Riga

Репутация: 2
Всего: 3



Если ещё актуально, то вот решение:

В файле "C:\boost_1_44_0\boost\thread\win32\thread_heap_alloc.hpp" с линии 59 по 72
заменить
Код
        inline BOOST_THREAD_DECL void* allocate_raw_heap_memory(unsigned size)
        {
            void* const heap_memory=detail::win32::HeapAlloc(detail::win32::GetProcessHeap(),0,size);
            if(!heap_memory)
            {
                boost::throw_exception(std::bad_alloc());
            }
            return heap_memory;
        }

        inline BOOST_THREAD_DECL void free_raw_heap_memory(void* heap_memory)
        {
            BOOST_VERIFY(detail::win32::HeapFree(detail::win32::GetProcessHeap(),0,heap_memory)!=0);
        }

на
Код
        inline void* allocate_raw_heap_memory(unsigned size)
        {
            void* const heap_memory=detail::win32::HeapAlloc(detail::win32::GetProcessHeap(),0,size);
            if(!heap_memory)
            {
                boost::throw_exception(std::bad_alloc());
            }
            return heap_memory;
        }

        inline void free_raw_heap_memory(void* heap_memory)
        {
            BOOST_VERIFY(detail::win32::HeapFree(detail::win32::GetProcessHeap(),0,heap_memory)!=0);
        }

т.е. просто удалить макрос BOOST_THREAD_DECL

Далее, в файле "C:\boost_1_44_0\libs\thread\src\win32\tss_pe.cpp"
закомментировать строки с 57(включительно) до 65(включительно).
Код
// extern "C" const IMAGE_TLS_DIRECTORY32 _tls_used __attribute__ ((section(".rdata$T"))) =
// {
        // (DWORD) &__tls_start__,
        // (DWORD) &__tls_end__,
        // (DWORD) &__tls_index__,
        // (DWORD) (&__crt_xl_start__+1),
        // (DWORD) 0,
        // (DWORD) 0
// };

И последнее, перед #include <boost/thread.hpp> нужно вписать #define BOOST_THREAD_USE_LIB
т.е.
Цитата
#define BOOST_THREAD_USE_LIB
#include <boost/thread.hpp>


з.ы. ессно нужно пересобрать thread
Цитата
bjam toolset=gcc --with-thread

з.ы.ы. проверял на
Цитата
C:\boost_1_44_0>g++ -v
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=c:/mingw/bin/../libexec/gcc/mingw32/4.5.1/lto-wrapper.exe
Target: mingw32
Configured with: ../../src/gcc-4.5.1/configure --build=mingw32 --enable-languages=c,ada,c++,fortran,objc,obj-c++ --enable-threads=win32 --enable-libg
mp --enable-lto --enable-fully-dynamic-string --enable-libstdcxx-debug --enable-version-specific-runtime-libs --disable-nls --disable-win32-registry
-disable-symvers --prefix=/mingw --disable-werror --enable-cxx-flags='-fno-function-sections -fno-data-sections' --with-pkgversion=tdm-1 --enable-sjl
-exceptions --with-bugurl=http://tdm-gcc.tdragon.net/bugs
Thread model: win32
gcc version 4.5.1 (tdm-1)

з.ы.ы.ы. понятия не имею будут ли корректно работать более сложные конструкции, но этот простой пример заработал  smile 

После всех этих манипуляций smile след. код работает на ура
Код
#define BOOST_THREAD_USE_LIB

#include <iostream>
#include <boost/thread.hpp>

void func(int time) {
  while (--time) {
    std::cout << "ping " << time << std::endl;
    boost::this_thread::sleep(boost::posix_time::seconds(1));
  }
}

int main() {
  boost::thread th(func, 10);
  th.join();

  return 0;
}


Цитата
ping 9
ping 8
ping 7
ping 6
ping 5
ping 4
ping 3
ping 2
ping 1
Press [Enter] to close the terminal ...

 smile 
--------------------
xor
PM MAIL Skype   Вверх
boostcoder
Дата 23.10.2010, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



плюс в репу smile 
PM WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0863 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.