Передача флага gcc через makefile - PullRequest
16 голосов
/ 09 августа 2009

Я пытаюсь построить проход, используя llvm , и я закончил сборку llvm и связанных с ним компонентов. Однако, когда я запускаю make после выполнения всех шагов по созданию прохода, включая makefile , я получаю следующее

перемещение R_X86_64_32 против `локального символа 'не может быть использовано при создании общего объекта; перекомпилировать с -fPIC

После попытки найти исправление путем поиска сообщения об ошибке, я узнал, что это не относится к llvm. Несколько решений предложили мне использовать «--enable-shared» при запуске configure, но это не помогло в моем случае. Теперь я хочу пересобрать llvm, используя fPIC, как говорится в сообщении об ошибке. Но как мне это сделать с помощью make-файла?

Ответы [ 3 ]

12 голосов
/ 09 августа 2009

Похоже, вы могли бы добавить -fPIC (для позиционно-независимого кода, то, что вы хотите для разделяемой библиотеки, которая может быть загружена по любому адресу), установив переменные оболочки:

export CFLAGS="$CFLAGS -fPIC"
export CXXFLAGS="$CXXFLAGS -fPIC"

Глядя на Makefile.rules , они будут собраны и использованы. Кажется странным, что его там не было с самого начала.

EDIT:

На самом деле, читая больше в make-файлах, я нашел эту ссылку на LLVM Makefile Guide . Из Makefile.rules, установка либо SHARED_LIBRARY = 1, либо LOADABLE_MODULE = 1 (что подразумевает SHARED_LIBRARY) в Makefile будет помещать -fPIC во флаги компилятора.

5 голосов
/ 09 августа 2009

Если вы умеренно убеждены, что вам следует использовать «-fPIC» везде (или «-m32» или «-m64», что мне нужно чаще), тогда вы можете использовать «трюк»:

CC="gcc -fPIC" ./configure ...

Предполагается, что оболочка Bourne / Korn / POSIX / Bash устанавливает переменную окружения CC на gcc -fPIC перед запуском скрипта конфигурирования. Это (обычно) гарантирует, что все компиляции выполняются с указанными флагами. Для установки правильной «кусочности» компиляции это иногда работает лучше, чем различные другие механизмы, которые вы обнаружите - компиляции сложно ее покачивать, за исключением полного игнорирования факта, который вы указали для использования компилятором C.

1 голос
/ 16 октября 2012

Другой вариант - передать -fPIC напрямую, чтобы сделать следующее:

make CFLAGS='-fPIC' CXXFLAGS='-fPIC'
...