Как да свържете библиотеки при кръстосано компилиране

Компилирам кръстосано отворени 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, вторият make се провали поради липсващи .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 се дължи на Makefiles. Двойният знак за долар е начинът да избегнете знака за долар, така че той да премине правилно през make-файла.

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


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

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

Ако нямате config.guess on-path, проверете за него в /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 Крос-компилация в ръководството на 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 е директорията за посочване, в която бих искал да експортирам резултата от компилацията. Ще tgz тази директория и ще я извлека в / на моята целева машина. Така че sysroot не е необходим според мен. - person user2491552; 18.12.2019
comment
@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 - Въз основа на опита ми с кръстосано компилиране, искате да зададете --sysroot. Това е опция за време за изграждане и казва на инструменталната верига къде да намери инструменти, заглавки и библиотеки. --sysroot не влияе на времето за изпълнение. За време на изпълнение искате да компилирате и свържете с -Wl,--enable-new-dtags -Wl,-R,'$$ORIGIN/../lib'. Това ви позволява да местите програмата във файловите системи. - person jww; 18.12.2019
comment
@user2491552 - На този етап мисля, че трябва да рестартирате. Използвайте правилните тройки за --build, --host и CROSS_COMPILE_HOST. Комплект CFLAGS, CXXFLAGS и LDFLAGS. Изградете всичко отново. Когато имате нов проблем, задайте нов въпрос. - person jww; 18.12.2019