Как скомпилировать 32-битный двоичный файл на 64-битных машинах с Linux, не затрагивая переменную среды CFLAGS
-
16-09-2019 - |
Вопрос
Решение в
Как скомпилировать 32-битный двоичный файл на 64-битной машине Linux с помощью gcc/cmake
это невозможно, потому что я использую стороннее программное обеспечение и другие программы, которые уже используют переменную CFLAGS.И патчить их make-файлы не разрешается, — говорит мой начальник.
Поэтому мне нужно найти другой способ обеспечить его соблюдение.Возможно, какое-то волшебство с символическими ссылками, перенаправляющими вызов gcc на 32-битную версию компилятора (в надежде, что цель по умолчанию не будет обнаружена динамически).
Решение
Вам не разрешено изменять CFLAGS в вашей среде, но есть ли какая-либо причина, по которой вы не можете временно отменить его для сборки?
Для пакета на основе autotool я бы сначала попробовал:
CFLAGS="-m32" ./configure [opts]
make
make install
Хорошо написанный configure.ac
файл должен учитывать вашу переменную CFLAGS и добавляться к ней, не требуя изменения исходного кода пакета.
Обновлять
Предполагая, что вы также не можете переопределить свою переменную CC, я бы сыграл несколько трюков с путями.Создайте сценарий оболочки в ${HOME}/gcc32
называется gcc
со следующим (непроверенным):
#!/bin/sh
/usr/bin/gcc -m32 "$@"
Затем добавьте это к своему пути, если хотите собрать 32-битную версию:
export PATH=${HOME}/gcc32:${PATH}
Очевидные модификации будут поддерживать g++
, icc
, или любой другой компилятор.
Другие советы
Предположим, что gcc и его друзья расположены в «/usr/bin».Предположим также, что у вас есть папка «~/.local/bin», которая находится на вашем пути.Вы можете создать скрипт bash с именем «gcc» в «~/.local/bin», например:
#! /bin/bash /usr/bin/gcc -m32 $@
Аналогичным образом вы можете создать сценарий «g++» со следующим содержимым:
#! /bin/bash /usr/bin/g++ -m32 $@
По сути, продолжайте делать это для «c++», «cc», «as», «ld» и т. д.по мере необходимости.Сделайте скрипты исполняемыми.Убедитесь, что «~/.local/bin» находится в переменной среды PATH ПЕРЕД «/usr/bin».В этом случае, когда make-файл вызывает компилятор (при условии, что они используют относительные пути), вместо этого будут вызываться ваши сценарии.