LINUX.ORG.RU

[c++][boost.thread][кросс-компиляция] проблемы с линковкой


0

1

Всем привет, пытаюсь собрать программу (проект не мой) кроссом:

$ x86_64-w64-mingw32-g++ --version
x86_64-w64-mingw32-g++ (GCC) 4.5.4 20110822 (prerelease)

Но линковщик не может найти некоторые символы из boost::thread:

x86_64-w64-mingw32-g++ -mthreads -Wl,-enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -mwindows -fstack-protector -Wl,-s -Wl,-subsystem,windows -o release/bitcoin-qt.exe object_script.bitcoin-qt.Release  -L'3rdparty/boost/lib' -L'3rdparty/openssl/lib' -L'3rdparty/db/lib' -L'/home/del/qt/4.7.4-win32/lib' -lmingw32 -lqtmain release/bitcoin-qt_res.o -lssl -lcrypto -ldb_cxx -lboost_system -lboost_filesystem -lboost_program_options -lboost_thread_win32 -lQtGui -lgdi32 -lcomdlg32 -loleaut32 -limm32 -lwinmm -lwinspool -lmsimg32 -lQtCore -lole32 -luuid -lws2_32 -ladvapi32 -lshell32 -luser32 -lkernel32 
./release/util.o:util.cpp:(.text+0x7eff): undefined reference to `__imp__ZN5boost6thread12start_threadEv'
./release/util.o:util.cpp:(.text+0x7f18): undefined reference to `__imp__ZN5boost6threadD1Ev'
./release/main.o:main.cpp:(.text+0x5e5e): undefined reference to `__imp__ZN5boost6thread20hardware_concurrencyEv'
./release/bitcoinrpc.o:bitcoinrpc.cpp:(.text+0x22d33): undefined reference to `__imp__ZN5boost6thread12start_threadEv'
./release/bitcoinrpc.o:bitcoinrpc.cpp:(.text+0x22e66): undefined reference to `__imp__ZN5boost6thread10timed_joinERKNS_10posix_time5ptimeE'
./release/bitcoinrpc.o:bitcoinrpc.cpp:(.text+0x23055): undefined reference to `__imp__ZN5boost6threadD1Ev'
./release/bitcoinrpc.o:bitcoinrpc.cpp:(.text+0x24331): undefined reference to `__imp__ZN5boost6threadD1Ev'
./release/bitcoinrpc.o:bitcoinrpc.cpp:(.text+0x24742): undefined reference to `__imp__ZN5boost6threadD1Ev'

boost.thread собран тем же кроссом, пробовал threadapi как posix, так и win32, но походу дело не в этом.

С той же версией буста под 64битный Linux те же самые исходники собираются нормально.

Подскажите, в чем может быть косяк, может кто-то уже сталкивался с аналогичными проблемами?

☆☆☆☆☆

Чем собираешь (cmake, autotools, bjam, etc.)?

-lboost_thread_win32

А там случайно не нужен ещё просто -lboost_thread? У меня собранный под msvc буст имеет только dll'ку boost_thread, никакой boost_thread_win32 нету...

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

1) Собираюсь через make (перед ним qmake)

2) lboost_thread_win32 - это когда я собирал буст с threadapi=win32, с threadapi=pthread я собираюсь с lboost_thread-mt. Ошибки те же самые. Да и если бы оно либу не нашло, то ошибка была бы совсем другая.

DELIRIUM ☆☆☆☆☆ ()

Нужно посмотреть на названия установленных библиотек.

например, у меня

user@localhost:~$ locate boost_thread
/home/user/dev/tools/boost/lib/libboost_thread-gcc44-mt-1_46_1.so
/home/user/dev/tools/boost/lib/libboost_thread-gcc44-mt-1_46_1.so.1.46.1
/home/user/dev/tools/boost/lib/libboost_thread-gcc44-mt-d-1_46_1.so
/home/user/dev/tools/boost/lib/libboost_thread-gcc44-mt-d-1_46_1.so.1.46.1
/home/user/dev/tools/boost/lib/libboost_thread-gcc44-mt-d.so
/home/user/dev/tools/boost/lib/libboost_thread-gcc44-mt.so

просто, по умолчанию библиотеки собираются в включением версии компилятора и буста в название либ-файлов.

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

Попробуй добавить дефайн BOOST_ALL_NO_LIB, чтоб заголовки буста не пытались автоматически левые библиотеки подключать (через #pragma), правда, ЕМНИП, это только для msvc.

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

Не помогло =(

Вообще, это что-то походу не то с бустом: тривиальный пример

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

using namespace std;

struct test
{
	void operator()() { cout << "Called" << endl; }
};

int main()
{
	test test_obj;
	boost::thread thr(test_obj);
	thr.join();
}

нормально компилириуется с системным бустом и компилятором, но кроссом выдает похожие ошибки:

$ x86_64-w64-mingw32-g++ -DBOOST_ALL_NO_LIB -Wall  test_boost.cpp -I ./3rdparty/boost/include/boost-1_47 -L ./3rdparty/boost/lib -lboost_thread-mgw-mt-s-1_47 -o test_boost.exe
In file included from ./3rdparty/boost/include/boost-1_47/boost/thread/win32/thread_data.hpp:12:0,
                 from ./3rdparty/boost/include/boost-1_47/boost/thread/thread.hpp:15,
                 from ./3rdparty/boost/include/boost-1_47/boost/thread.hpp:13,
                 from test_boost.cpp:2:
./3rdparty/boost/include/boost-1_47/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
./3rdparty/boost/include/boost-1_47/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
/tmp/ccSmsBnO.o:test_boost.cpp:(.text+0xde): undefined reference to `__imp__ZN5boost6thread4joinEv'
/tmp/ccSmsBnO.o:test_boost.cpp:(.text+0xfb): undefined reference to `__imp__ZN5boost6threadD1Ev'
/tmp/ccSmsBnO.o:test_boost.cpp:(.text+0x1c3): undefined reference to `__imp__ZN5boost6threadD1Ev'
/tmp/ccSmsBnO.o:test_boost.cpp:(.text$_ZN5boost6threadC1I4testEET_NS_10disable_ifINS_14is_convertibleIRS3_NS_6detail13thread_move_tIS3_EEEEPNS0_5dummyEE4typeE[boost::thread::thread<test>(test, boost::disable_if<boost::is_convertible<test&, boost::detail::thread_move_t<test> >, boost::thread::dummy*>::type)]+0xd5): undefined reference to `__imp__ZN5boost6thread12start_threadEv'
collect2: ld returned 1 exit status

Библиотеки:

$ ls 3rdparty/boost/lib/libboost_thread-mgw-mt-s* -l
-rw-r--r-- 1 del users 226964 Sep 28 11:25 3rdparty/boost/lib/libboost_thread-mgw-mt-s-1_47.a
-rw-r--r-- 1 del users 916896 Sep 28 11:17 3rdparty/boost/lib/libboost_thread-mgw-mt-sd-1_47.a
DELIRIUM ☆☆☆☆☆ ()
Ответ на: комментарий от Kosyak

Буст собран статически.

./b2 -a toolset=gcc target-os=windows threading=multi threadapi=pthread link=static runtime-link=static --layout=versioned install

Специально проверил, собрал линуксовый boost_thread из тех же исходников и тот же самый пример на линуксе им нормально собрался.

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

Попробуй так:

./b2 -a toolset=gcc target-os=windows threading=multi threadapi=pthread runtime-link=static --layout=versioned --build-type=complete install
Он должен собрать и динамические и статические версии. У меня почему-то при только link=shared косяки были.

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

Как и ожидалось, с этим флагом такие же статические либы, как и раньше + динамические:

libboost_thread-mgw-mt-1_47.dll
libboost_thread-mgw-mt-1_47.dll.a

libboost_thread-mgw-mt-d-1_47.dll    
libboost_thread-mgw-mt-d-1_47.dll.a

С ними (которые линкуется нормально, но бинарник получается не статический и требует для запуска libboost_thread-mt-1_47.dll и pthreadGC2.dll .

Нету идей, почему со статическими либами имеет место проблема при линковке? Может стоит написать в рассылку boost?

DELIRIUM ☆☆☆☆☆ ()

Пообщался с девл-рассылкой буста и запостил это

DELIRIUM ☆☆☆☆☆ ()

а простенький исходник с #include <iostream> и cout

Например

#include <iostream>

int main(int argc, char **argv)
{
	std::cout << "hello\n";
	return 0;

}

просто у меня с версией gcc 4.5.3 не собирается, а с 4.4.5 собирается

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

Прогнал тесты. Собирался так:

x86_64-w64-mingw32-g++ -I ./boost/svn_74606-win64/include/boost-1_48 -o test.exe kk.cpp ./boost/svn_74606-win64/lib/libboost_thread-mgw-mt-1_48.a
int main()
{
}

Всё окей.

#include <boost/thread.hpp>
int main()
{
}

Всё окей.

#include <boost/thread.hpp>
int main()
{
	boost::thread thr;
}

не окей:

/tmp/ccm0ryQa.o:kk.cpp:(.text+0x17): undefined reference to `__imp__ZN5boost6threadC1Ev'
/tmp/ccm0ryQa.o:kk.cpp:(.text+0x27): undefined reference to `__imp__ZN5boost6threadD1Ev'
DELIRIUM ☆☆☆☆☆ ()
Ответ на: комментарий от zhekas
#include <iostream>
int main()
{
        std::cout << "Test\n";
}
[del@del-arch ~]$ x86_64-w64-mingw32-g++ -I ./boost/svn_74606-win64/include/boost-1_48 -o test.exe kk.cpp ./boost/svn_74606-win64/lib/libboost_thread-mgw-mt-1_48.a -static-libgcc -static-libstdc++
[del@del-arch ~]$ wine test.exe
fixme:seh:RtlAddFunctionTable 0x49e0e0 1 400000: stub
Test
DELIRIUM ☆☆☆☆☆ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.