LINUX.ORG.RU

MinGW, G++, boost.


0

2

Линкер пытается найти символ и не находит:
_imp___ZN5boost11this_thread18interruption_pointEv

А в линкуемой библиотеке «libboost_thread-mgw45-mt-1_46_1.a» находится максимум такой:
__ZN5boost11this_thread18interruption_pointEv

Библиотека кривая или ищется не то? Почему?

Спасибо.

Был подобный случай с mingw: при сборке нужно было указать не то другое имя библиотеки (префикс imp), не то другое расширение.

sched ()

Это он, кажись, хочет DLL, а ты ему static library подсовываешь.

k_andy ★★★ ()
Ответ на: комментарий от sched

Можно поподробнее, я не очень понял, что Вы имеете в виду. Но если это заработает, то это значительно сэкономит мне время =)

DELIRIUM ☆☆☆☆☆ ()
Ответ на: комментарий от kiverattes

Нефига, это я тоже пробовал, там в баге описано это. Получается

/3rdparty/boost/include/boost-1_47 ./3rdparty/boost/lib/libboost_thread-mgw-mt-1_47.a /home/del/pthreads-w64/pthreads/libpthreadGC2.a -o test_boost.exe ./3rdparty/boost/lib/libboost_thread-mgw-mt-1_47.a(thread.o): duplicate section `.data$_ZTIN5boost6detail16thread_data_baseE[typeinfo for boost::detail::thread_data_base]' has different size ./3rdparty/boost/lib/libboost_thread-mgw-mt-1_47.a(thread.o):thread.cpp:(.text+0x3a00): multiple definition of `boost::detail::thread_data_base::~thread_data_base()' /tmp/ccROgsoo.o:test_boost.cpp:(.text$_ZN5boost6detail16thread_data_baseD2Ev[boost::detail::thread_data_base::~thread_data_base()]+0x0): first defined here ./3rdparty/boost/lib/libboost_thread-mgw-mt-1_47.a(thread.o):thread.cpp:(.text+0x3a00): multiple definition of `boost::detail::thread_data_base::~thread_data_base()' /tmp/ccROgsoo.o:test_boost.cpp:(.text$_ZN5boost6detail16thread_data_baseD1Ev[boost::detail::thread_data_base::~thread_data_base()]+0x0): first defined here ./3rdparty/boost/lib/libboost_thread-mgw-mt-1_47.a(thread.o):thread.cpp:(.text+0x3d50): multiple definition of `boost::detail::thread_data_base::~thread_data_base()' /tmp/ccROgsoo.o:test_boost.cpp:(.text$_ZN5boost6detail16thread_data_baseD0Ev[boost::detail::thread_data_base::~thread_data_base()]+0x0): first defined here collect2: ld returned 1 exit status 
DELIRIUM ☆☆☆☆☆ ()
Ответ на: комментарий от DELIRIUM

Ну это не просто «нифига», это уже что-то новое.

А -DBOOST_THREAD_USE_LIB я добавлял в CMakeLists.txt.

add_definitions(-DBOOST_ALL_NO_LIB)

И право же я незнаю, как это на самом деле работает, возможно это даже не определяет макрос препроцессора.

kiverattes ★☆ ()
Ответ на: комментарий от DELIRIUM

Кажется было так: было несколько версий объектного файла библиотеки, одна с __imp__ другая без. Проблема решилась заменой -lcurl на -lcurl.dll (собирал на windows машине проект с libcurl).

В общем случае нужно найти нужную версию и посмотреть что использует линковщик и где оно лежит.

sched ()
Ответ на: комментарий от sched

Я пробовал линковаться и через -lboost_thread... и явно задавать имя статической либы. Плюс буст я собирал сам и никаких __imp_ либ на выходе нету.

DELIRIUM ☆☆☆☆☆ ()
Ответ на: комментарий от DELIRIUM

Немного покопался: суть в том, что методы всех классов в boost::thread заданы через __declspec(dllimport) , что заставляет линковщик добавлять __imp__ перед именами.

Решения два:

1) В хедерах sed'ом убрать __declspec(dllimport)

2) Разобраться, почему при линковке конечного бинаря оно срабатывает, а при сборке самой библиотеки boost_thread, нет. И починить.

Второй вариант я пока не успел поковырять, а с первым работает и линковщик больше не ругается на эти __imp__-функции.

DELIRIUM ☆☆☆☆☆ ()
Ответ на: комментарий от DELIRIUM

Спасибо, очень интересно. Хотя у меня всё и починилось моим вышеуказанным нагуглённым методом, но разобраться всегда интересно, хотя времени на это никогда и нет (-;

kiverattes ★☆ ()
Ответ на: комментарий от DELIRIUM

Так ведь жеж у меня получилось опцией в CMake что-то переключить так, что оно заработало. То есть там есть какой-то «переключатель». Может в этом надо разобраться?

kiverattes ★☆ ()
Ответ на: комментарий от kiverattes

BOOST_THREAD_USE_LIB нормально сработал у меня с самого начала. Я только после копания в сырцах уже понял, как именно он «работает». Но у меня была ещё одна проблема: там линкер ругался на разные размеры структуры thread_data_base в двух объектных файлах (один из самого буста, а второй полученный из моего исходника). Я в итоге выяснил, что при компиляции исходника своего за счет дефайнов mingw он использовались win32 треды и в итоге ничего не линковалось, естесственно. Там есть дефайн, BOOST_THREAD_POSIX, который при сборке исходника надо указывать, и тогда всё окей.

Я уже багу прикрыл сам как invalid. Странно, что мне об этом ничего не смогли сказать в рассылке буста.

DELIRIUM ☆☆☆☆☆ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.