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

Как работать с внешними библиотеками при скрещивании?

Я пишу код для малины pi ARM target на компьютере x86 ubuntu. Я использую toolchain gcc-linaro-armhf. Я могу перекрестно скомпилировать и запустить некоторые независимые программы на pi. Теперь я хочу связать свой код с внешней библиотекой, такой как ncurses. Как я могу это достичь.

Должен ли я просто связать свою программу с существующим ncurses lib на главной машине, а затем запустить на ARM? (Я не думаю, что это сработает) Мне нужно получить исходную или предварительно созданную версию lib для руки, поместить ее в мой путь к lib и затем скомпилировать?

Какова наилучшая практика в подобной ситуации?

Я также хочу знать, как это работает для c stdlib. В моей программе я использовал функции stdio, и он работал после скрещивания, не делая ничего особенного. Я просто предоставил путь для моей руки gcc в makefile. Итак, я хочу знать, как он получил правильные заголовки std и libs?

4b9b3361

Ответ 1

Относительно ваших общих вопросов:

Почему работает библиотека C:

Библиотека C является частью вашей перекрестной цепочки. Вот почему заголовки найдены, и программа правильно связывается и работает. Это справедливо и для некоторых других очень простых системных библиотек, таких как libm и libstdС++ (не в каждом случае, зависит от конфигурации инструментальной цепочки).

В целом при работе с кросс-разработкой вам нужно каким-то образом собрать нужные библиотеки. Использование двоичных файлов в этом случае очень редко. То есть, особенно с оборудованием ARM, потому что существует так много разных конфигураций, и часто все разделяется по-разному. Это значит, что двоичные файлы не очень бинарно совместимы между различными устройствами и конфигурациями Linux.

Если вы используете Ubuntu на Raspberry Pi, есть вероятность, что вы найдете подходящую библиотеку ncurses в Интернете или даже в каком-то репозитории Ubuntu apt. Типичным способом, однако, будет перекрестная компиляция библиотеки с помощью конкретной инструментальной цепочки, которую вы получили.

В случаях, когда много и сложные библиотеки нужно перекрестно скомпилировать, есть решения, которые делают жизнь немного проще, например buildroot или ptxdist. Эти программы создают полные ядра Linux и корневые файловые системы для встроенных устройств.

В вашем случае, однако, пока вы только хотите ncurses, вы можете самостоятельно скомпилировать исходный код. Вам просто нужно загрузить источники, запустите configure, указав свою инструментальную цепочку, используя опцию --host. Опция --prefix выберет каталог установки. После запуска make и make install, учитывая, что все прошло хорошо, у вас будет набор заголовков и ARM-скомпилированная библиотека для вашего приложения, чтобы связать ее.

Что касается кросс-компиляции, вы наверняка найдете множество информации в Интернете, и, возможно, ncurses также имеет некоторые указатели в своей отгруженной документации.

Ответ 2

Для запроса How the C library works in cross-tools

При компиляции и построении кросс-инструментальной цепочки во время конфигурации они будут обеспечивать sysroot.

like --with-sysroot=${CLFS_CROSS_TOOLS}

--with-sysroot --with-sysroot=dir

Tells GCC to consider dir as the root of a tree that contains (a subset of) the root filesystem of the target operating system. Target system headers, libraries and run-time object files will be searched for in there. More specifically, this acts as if --sysroot=dir was added to the default options of the built compiler. The specified directory is not copied into the install tree, unlike the options --with-headers and --with-libs that this option obsoletes. The default value, in case --with-sysroot is not given an argument, is ${gcc_tooldir}/sys-root. If the specified directory is a subdirectory of ${exec_prefix}, then it will be found relative to the GCC binaries if the installation tree is moved.

Поэтому вместо поиска /lib /usr/include он будет выглядеть /Toolchain/ (libc) и (include files), когда компилируется

вы можете проверить

arm-linux-gnueabihf-gcc -print-sysroot

показать, где искать libc.

также

arm-linux-gnueabihf-gcc -print-search-dirs

дает четкое изображение

Ответ 3

Очевидно, вам понадобится ncurses, скомпилированный для ARM, на который вы нацеливаетесь, - тот, который на хосте будет абсолютно вам вообще не нужен [если ваш хост не имеет ARM-процессора, но вы сказали x86, так ясно не тот случай].

МОЖНО быть доступными некоторые готовые библиотеки, но я подозреваю, что больше работать над тем, чтобы найти один (который работает и соответствует вашим конкретным условиям), чем создавать библиотеку самостоятельно из источников - это не должно быть так сложно, и я ожидаю, t20 > не требуется много минут для сборки.

Ответ 4

Что касается вашего первого вопроса, если вы намереваетесь использовать библиотеку ncurses с помощью вашей кросс-компиляционной инструментальной цепочки, у вас будут подготовлены созданные вручную файлы.

Ваш второй вопрос: как это работает с std libs, ну, на самом деле это не система libc/libm, которую использует toolchain для компиляции/связывания вашей программы. Возможно, вы увидите его из опции -print-file- name= вашего компилятора:

arm-none-linux-gnuabi-gcc --print-file-name=libm.a

...(my working folder)/arm-2011.03(arm-toolchain folder)/bin/../arm-none-linux-gnuabi/libc/usr/lib/libm.a

arm-none-linux-gnuabi-gcc --print-file-name=libpthread.so

...(my working folder)/arm-2011.03(arm-toolchain folder)/bin/../arm-none-linux-gnuabi/libc/usr/lib/libpthread.so

Я думаю, что ваша малиновая инструментальная цепочка может быть одинаковой. Вы можете попробовать это.

Ответ 5

Ответ на Vinay довольно прочный. Просто исправление при компиляции библиотеки ncurses для малины pi для установки ваших rootfs составляет --sysroot=<dir>, а не --with-sysroot. Вот что я нашел, когда использовал следующий компилятор:

arm-linux-gnueabihf-gcc --version
arm-linux-gnueabihf-gcc (crosstool-NG linaro-1.13.1+bzr2650 - Linaro GCC 2014.03) 4.8.3 20140303 (prerelease)
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.