Доброго времени суток! Пытаюсь собрать .so библиотеку и максимально скомпоновать в нее все зависимости.
* Компиляция:
CXXFLAGS=-std=c++14 -fPIC -Wall -Weffc++ -O3
g++ $(CXXFLAGS) -c file.cpp
* Компоновка:
boost_path=/usr/lib/x86_64-linux-gnu
LIBS=$(boost_path)/libboost_system.a $(boost_path)/libboost_thread.a # and so on...
g++ $(CXXFLAGS) -o lib.so -shared file.o $(LIBS)
На 32-разрядных дистрибутивах debian/ubuntu/mint все ок,
на 64-разрядных компоновщик ругается матом:
/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/7/crtbeginT.o: relocation R_X86_64_32 against hidden symbol `__TMC_END__' can not be used when making a shared object
/usr/bin/ld: /usr/lib/x86_64-linux-gnu/libboost_system.a(error_code.o): relocation R_X86_64_PC32 against symbol `_ZTVN5boost6system14error_categoryE' can not be used when making a shared object; перекомпилируйте с параметром -fPIC
/usr/bin/ld: final link failed: Некорректное значение
C libcryptopp.a точно так же.
В интернетах много обсуждений подобных вопросов, но решения я не нашел.
Существует ли возможность как-то повлиять на ситуацию или по рекомендациям компоновщика начать пересобирать все статические библиотеки с флагом -fPIC, и поможет ли это вообще?
Спасибо!
Пересобрал boost с флагом -fPIC и долго пытался понять, почему cmake нормально собирает библиотеки .so, а мой Makefile не хочет. Получается, флаги -static-libstdc++ и -static-libgcc работают нормально, а при попыте компоновки любой статической библиотеки, собранной, видимо, без -fPIC, все ломается, соответственно, флаг -static, который бы мне очень хотелось использовать, использовать не получится, если не собрать руками libc.
Неужели нет менее болезненного решения?