LINUX.ORG.RU

Проблемы с boost в Ubuntu

 ,


0

2

Доброго времени суток. Возникла проблема при сборке проекта под Ubuntu 16.04 и 14.04. При этом, под арчем (с версией boost 1.63) и под генту (с версией boost 1.56) проект собирается нормально.
Вот Makefile:

CC = g++
CFLAGS = -c -std=c++11 -Wall -Wextra
LFLAGS = -lboost_system -lboost_thread -lpthread

all: server client

server: servermain.o daemon.o
	$(CC) $(LFLAGS) servermain.o daemon.o -o frtpdaemon
servermain.o: server/main.cpp
	$(CC) $(CFLAGS) server/main.cpp -o servermain.o
clog.o: server/clog.hpp
	$(CC) $(CFLAGS) server/clog.hpp -o clog.o
parser.o: server/cparser.hpp
	$(CC) $(CFLAGS) server/cparser.hpp -o parser.o
daemon.o: server/cdaemon.cpp server/cdaemon.h
	$(CC) $(CFLAGS) server/cdaemon.cpp -o daemon.o

client: clientmain.o client.o
	$(CC) $(LFLAGS) -shared clientmain.o client.o -o libfrtpsrv.so
clientmain.o: client/main.cpp
	$(CC) $(CFLAGS) -fpic client/main.cpp -o clientmain.o
client.o: client/cclient.cpp client/cclient.h
	$(CC) $(CFLAGS) -fpic client/cclient.cpp -o client.o

clean:
	rm *.o frtpdaemon libfrtpsrv.so
При сборке в Ubuntu возникают следующие ошибки линковщика:
servermain.o: In function `__static_initialization_and_destruction_0(int, int)':
main.cpp:(.text+0x1de): undefined reference to `boost::system::generic_category()'
main.cpp:(.text+0x1ea): undefined reference to `boost::system::generic_category()'
main.cpp:(.text+0x1f6): undefined reference to `boost::system::system_category()'
servermain.o: In function `boost::asio::error::get_system_category()':
main.cpp:(.text._ZN5boost4asio5error19get_system_categoryEv[_ZN5boost4asio5error19get_system_categoryEv]+0x5): undefined reference to `boost::system::system_category()'
daemon.o: In function `__static_initialization_and_destruction_0(int, int)':
cdaemon.cpp:(.text+0x16bb): undefined reference to `boost::system::generic_category()'
cdaemon.cpp:(.text+0x16c7): undefined reference to `boost::system::generic_category()'
cdaemon.cpp:(.text+0x16d3): undefined reference to `boost::system::system_category()'
daemon.o: In function `boost::system::error_code::error_code()':
cdaemon.cpp:(.text._ZN5boost6system10error_codeC2Ev[_ZN5boost6system10error_codeC5Ev]+0x17): undefined reference to `boost::system::system_category()'
daemon.o: In function `boost::asio::detail::posix_signal_blocker::posix_signal_blocker()':
cdaemon.cpp:(.text._ZN5boost4asio6detail20posix_signal_blockerC2Ev[_ZN5boost4asio6detail20posix_signal_blockerC5Ev]+0x64): undefined reference to `pthread_sigmask'
daemon.o: In function `boost::asio::detail::posix_signal_blocker::~posix_signal_blocker()':
cdaemon.cpp:(.text._ZN5boost4asio6detail20posix_signal_blockerD2Ev[_ZN5boost4asio6detail20posix_signal_blockerD5Ev]+0x2d): undefined reference to `pthread_sigmask'
collect2: error: ld returned 1 exit status
Boost в убунте установлен. Вместо -lboost_system и -lboost_thread пробовал указывать библиотеки явно, что все равно не привело ни к каким результатам. Кто-то сталкивался с таким?

Ответ на: комментарий от evilface

из какой логики такое должно работать?

Из логики откровенно слабого линкера ld в GCC (или binutils?), который не может нормально построить дерево зависимостей, а значит порядок линковки для него до сих пор важен. К слову, в компиляторе MS Visual Studio такой ахинеи нет. Возможно, её нет и в gold (но тут не уверен). Но в случае с ld это более чем распространено: bbqscreen_client

Что помешало GNU (или кто там этим ld занимается) сделать нормально, как в той же MS Visual Studio — загадка.

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

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

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

+ и только, нефик клепать абы как если взялся, тоже убежден что линковщик прав либо конкретно усторел в противном случае

dima1981 ()
Последнее исправление: dima1981 (всего исправлений: 2)
Ответ на: комментарий от maked0n

А при сборке видно, что линкер вызывается именно с этими параметрами? Он даже pthread_sigmask не находит, что странно.

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

Да, вызывается с этими параметрами.

g++ -c -std=c++11 -Wall -Wextra server/main.cpp -o servermain.o
g++ -c -std=c++11 -Wall -Wextra server/cdaemon.cpp -o daemon.o
g++ -lboost_thread -lboost_system -lpthread servermain.o daemon.o -o frtpdaemon
servermain.o: In function `__static_initialization_and_destruction_0(int, int)':
main.cpp:(.text+0x1de): undefined reference to `boost::system::generic_category()'
main.cpp:(.text+0x1ea): undefined reference to `boost::system::generic_category()'  
...

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

Не получилось сейчас воспроизвести, но помню, что как-то перемещал -l после *.o при сборке. man подтверждает, что это может влиять. Т.е. можно попробовать $(LFLAGS) переместить в конец строки сборки.

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

Да, это помогло, спасибо. Только непонятно: почему именно под убунту возникла такая проблема? Хотя тот же makefile под генту и под арчем выполнял свои функции отлично.

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

Вероятно из-за каких-то специфичных для диструбутивов изменений в тулчейне. gcc можно по-разному собрать, а потом ещё spec-файлы подправить. Может добавление -### к LFLAGS покажет разницу в вызове линкера (только вывод ещё надо разобрать, там куча всего).

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