Подтвердить что ты не робот

Как заставить компиляцию 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 для даже статических библиотек, которые он создает?

4b9b3361

Ответ 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, но это, похоже, не повредит.

Ссылки: