Как заставить компиляцию Boost использовать -fPIC
Команда, в которой я работаю, создает общую библиотеку для использования в Python. Эта библиотека полностью С++, и мы используем Boost для отображения на python. Поскольку мы не можем гарантировать, что у наших клиентов установлены библиотеки Boost, мы статически ставим функции, необходимые из Boost в общий файл объекта. Заключительный этап компиляции будет хорошо знаком многим.
g++ -o <output> <objects> -Wl,-Bstatic -lboost_python -lboost_regex ... -Wl,-Bdynamic -shared <other_opts>
Мы традиционно использовали нашу собственную сборку Boost: 1.47. Эта версия сейчас довольно старая, поэтому мы хотим обновить ее. Однако, как ни странно, когда я устанавливаю необходимые объекты с помощью yum в моей системе CentOS 7, я получаю следующую ошибку от gcc:
relocation R_X86_64_32 against '.rodata.str1.1' can not be used when making a shared object; recompile with -fPIC
Ну, я думал, что просто скачаю последнюю версию (CentOS 7 устанавливает Boost 1.53) и сделаю мою собственную сборку. Это, в конце концов, всегда сработало для нас. Я следую инструкциям здесь, но я получил ту же ошибку. Как принудительно использовать -fPIC для даже статических библиотек, которые он создает?
Ответы
Ответ 1
Я считаю, что boost автоматически использует -fPIC
при компиляции разделяемой библиотеки (.so файл), но в приведенной ниже команде используется -fPIC
при компиляции статической библиотеки (.a файл).
Это работало для меня на boost 1.46.1:
sudo ./bjam cxxflags=-fPIC cflags=-fPIC -a ... install
В ...
вы добавляете дополнительные флаги, такие как threading=multi
или --layout=tagged
, и, при необходимости, список проектов для сборки (например: --with-regex
).
Примечание: я не уверен, что нужно cflags
, но это, похоже, не повредит.
Ссылки: