Как связать библиотеки при кросс-компиляции

Я кросс-компилирую открытые инструменты VMWare. Я предварительно скомпилировал glib и устанавливаю переменную PKG_CONFIG_PATH, чтобы связать их. Я получаю следующие ошибки на этапе ссылки.

libtool: link: warning: library `/u/git/extlib_vmtools/usr/local/lib/libgthread-2.0.la' was moved.
/bin/grep: /usr/local/lib/libglib-2.0.la: No such file or directory
/bin/sed: can't read /usr/local/lib/libglib-2.0.la: No such file or directory
libtool: link: `/usr/local/lib/libglib-2.0.la' is not a valid libtool archive
make[2]: *** [libhgfs.la] Error 1
make[2]: Leaving directory `/u/git/extlib_vmtools/src/open-vm-tools-11.0.0-14549434/libhgfs'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/u/git/extlib_vmtools/src/open-vm-tools-11.0.0-14549434'

Я следил за этим полезным сообщением (DESTDIR и PREFIX make), но я думаю, что я чего-то не хватает. Я не устанавливал --prefix ни для одного модуля, так как хочу использовать структуру каталогов по умолчанию при развертывании.

компиляция glib (нижний модуль):

./configure --host=${CROSS_COMPILE_HOST}
make
make install DESTDIR=/home/xport/

Компиляция open-vmware-tools (верхний модуль):

export PKG_CONFIG_SYSROOT_DIR="/home/xport/"
export PKG_CONFIG_PATH="/home/xport/usr/local/lib/pkgconfig"
autoreconf -i
./configure --host=${CROSS_COMPILE_HOST} --enable-lib64=no --without-kernel-modules --without-pam --disable-vgauth --without-x --without-gtk3 --without-gtk2 --without-gtkmm3 --without-gtkmm --enable-resolutionkms=no --enable-deploypkg=no
make
make install DESTDIR=/home/xport # <-- I don't even get here

До того, как я установил переменную PKG_CONFIG_PATH, вторая сборка не удалась из-за отсутствия файлов .h... Итак, я знаю, что связь .pc работает. Что мне не хватает? Спасибо !


person user2491552    schedule 17.12.2019    source источник
comment
Когда вы запускаете configure, вам нужно указать цель для сборки, хост по умолчанию будет использовать локальную хост-систему.   -  person Some programmer dude    schedule 17.12.2019
comment
@SomeProgrammerDude - близко. Используйте --build, а не --target. --target используется для сборки компилятора для арки. Очень запутанно...   -  person jww    schedule 17.12.2019


Ответы (1)


./configure --host=${CROSS_COMPILE_HOST} ...

Вам нужно установить как --build, так и --host из-за ошибки Autoconf. Предполагая, что вы строите для ARMv7l, что-то вроде:

./configure --host=$(config.guess) --build=armv7l-unknown-linux-gnueabihf

Следующее выглядит нормально для меня, если предположить, что /home/xport/usr/local/lib/pkgconfig является допустимым, а /home/xport/usr/local является расположением файлов include/ и lib/ для арки.

export PKG_CONFIG_PATH="/home/xport/usr/local/lib/pkgconfig"

Я не уверен в том, что следует. Также отсутствует --build. И я привык видеть --sysroot при кросс-компиляции:

./configure --host=${CROSS_COMPILE_HOST} \
    --enable-lib64=no --without-kernel-modules --without-pam --disable-vgauth \
    --without-x --without-gtk3 --without-gtk2 --without-gtkmm3 --without-gtkmm \
    --enable-resolutionkms=no --enable-deploypkg=no

CFLAGS и CXXFLAGS, вероятно, должны включать --sysroot. Может быть, что-то вроде:

./configure --host=$(config.guess) --build=armv7l-unknown-linux-gnueabihf \
    --sysroot="/home/xport/usr/local" --enable-lib64=no --without-kernel-modules ...

Or:

    CFLAGS="--sysroot=/home/xport/usr/local" \
    CXXFLAGS="--sysroot=/home/xport/usr/local" \
./configure --host=$(config.guess) --build=armv7l-unknown-linux-gnueabihf \
    --enable-lib64=no --without-kernel-modules ...

DESTDIR предназначен для постановки. Это выглядит нормально:

make install DESTDIR=/home/xport/

Если вы собираетесь запускать из каталога /home/xport/, вам следует рассмотреть возможность добавления следующего в LDFLAGS:

# 64-bit Fedora
-Wl,--enable-new-dtags -Wl,-R,'$$ORIGIN/../lib64'
# Most others
-Wl,--enable-new-dtags -Wl,-R,'$$ORIGIN/../lib'

Так что, может быть, что-то вроде:

    CFLAGS="--sysroot=/home/xport/usr/local" \
    CXXFLAGS="--sysroot=/home/xport/usr/local" \
    LDFLAGS="-Wl,--enable-new-dtags -Wl,-R,'$$ORIGIN/../lib'" \
./configure --host=$(config.guess) --build=armv7l-unknown-linux-gnueabihf \
    --enable-lib64=no --without-kernel-modules ...

Пути запуска на основе $ORIGIN — это то, что делает поэтапную установку с DESTDIR эффективной.

Двойной знак доллара в $$ORIGIN связан с файлами Makefile. Двойной знак доллара — это способ избежать знака доллара, чтобы он правильно проходил через make-файл.

Также см. Как правильно включить аргумент компоновщика -Wl,-rpath,$ORIGIN в Makefile?


config.guess предоставляет вам триплет Autoconf:

$ /usr/share/libtool/build-aux/config.guess
x86_64-pc-linux-gnu

Если у вас нет пути config.guess, проверьте его в /usr/share:

$ find /usr/share -name config.guess
/usr/share/misc/config.guess
/usr/share/libtool/config/config.guess
/usr/share/automake-1.14/config.guess

Также см. 2.2.8 Cross-Compilation в руководстве Autoconf. :

Кросс-компиляция — это сборка на одной платформе бинарного файла, который будет работать на другой платформе. Говоря о кросс-компиляции, важно различать платформу сборки, на которой выполняется компиляция, и хост-платформу, на которой ожидается запуск полученного исполняемого файла. Для указания каждого из них используются следующие параметры конфигурации:

--build=сборка

Система, на которой построен пакет.

--host=хост

Система, в которой будут работать встроенные программы и библиотеки.

И чуть ниже:

Опции --host и --build обычно все, что нам нужно для кросс-компиляции. Единственное исключение — если собираемый пакет сам является кросс-компилятором: нам нужна третья опция, чтобы указать его целевую архитектуру.

--target=цель

При создании инструментов компилятора: система, для которой инструменты будут создавать выходные данные.


Относительно комментария "Я даже сюда не дохожу":

make
make install DESTDIR=/home/xport # <-- I don't even get here

Вам нужно показать ошибку компиляции, с которой вы сталкиваетесь при запуске make.

person jww    schedule 17.12.2019
comment
OK Тестирование... config.guess=x86_64-unknown-linux-gnu и CROSS_COMPILE_HOST=i686-linux. Это нормально, и ваш комментарий все еще актуален? Потому что glib (одна из зависимостей) не проходит предварительную проверку конфигурации. Спасибо ! - person user2491552; 18.12.2019
comment
Кроме того, /home/xport — это каталог, в который я хотел бы экспортировать вывод компиляции. Я перетащу этот каталог и извлеку его в / на моей целевой машине. Так что sysroot не нужен, я думаю. - person user2491552; 18.12.2019
comment
@user2491552 user2491552 — Судя по комментарию CROSS_COMPILE_HOST, вам, вероятно, следует использовать CROSS_COMPILE_HOST=i686-unknown-linux-gnu и --host=i686-unknown-linux-gnu, если вы собираетесь работать на 32-разрядной версии i686. - person jww; 18.12.2019
comment
@user2491552 user2491552 — Основываясь на моем опыте кросс-компиляции, вы хотите установить --sysroot. Это параметр времени сборки, который сообщает цепочке инструментов, где найти инструменты, заголовки и библиотеки. --sysroot не влияет на время выполнения. Во время выполнения вы хотите скомпилировать и связать с -Wl,--enable-new-dtags -Wl,-R,'$$ORIGIN/../lib'. Это позволяет вам перемещать программу по файловым системам. - person jww; 18.12.2019
comment
@user2491552 user2491552 - Думаю, вам следует перезагрузиться. Используйте правильные триплеты для --build, --host и CROSS_COMPILE_HOST. Установите CFLAGS, CXXFLAGS и LDFLAGS. Построить все заново. Когда у вас возникнет новая проблема, задайте новый вопрос. - person jww; 18.12.2019