Как скомпилировать C++-библиотеку с зависимостями?
Мне нужно скомпилировать некоторую библиотеку C / C++. Библиотека зависит от нескольких библиотек C/C++. Некоторые из библиотек, в свою очередь, зависят от других библиотек. Все библиотеки поставляются со сценарием configure. Я знаю, как компилировать и устанавливать библиотеки на хост – систему-устанавливать зависимости перед lib, который мне нужен. Очевидно, что это не будет работать при кросс-компиляции. Любые советы приветствуются. Спасибо.
3 ответов
как правило, для кросс-компиляции autotooled пакета вы передаете пару дополнительных аргументов ./configure
: --host
и --build
. --host
- это имя системы, в которой будут работать встроенные программы, и --build
- это имя системы, которая выполняет компиляцию.
когда я говорю "имя системы", я имею в виду кортеж вида ARCH-VENDOR-OS-LIBC
. (Например,i686-pc-linux-gnu
- это кортеж, описывающий систему, которую я сейчас использую.) Иногда части кортежа удаляются, как в случае цепочка инструментов mingw32 (в моей системе перекрестные инструменты mingw32 устанавливаются с помощью кортежа i586-mingw32msvc
и/или amd64-mingw32msvc
).
(есть еще один аргумент, чтобы настроить, --target
, который предназначен для кросс-компиляторов и определяет систему, на которую будет нацелен создаваемый компилятор при генерации кода.)
каждый набор инструментов имеет свой собственный подкаталог /usr
например /usr/i586-mingw32msvc
. Вы захотите установить здесь новые пакеты, чтобы они были найдены. Используйте --prefix
аргумент к configure
.
поэтому для кросс-компиляции из моей системы GNU / Linux в систему MinGW32 я бы запустил configure
такой:
./configure --host=i586-mingw32msvc --build=i686-pc-linux-gnu --prefix=/usr/i586-mingw32msvc
Итак, начните с листьев вашего графика зависимостей и пройдите свой путь вверх. Вы также можете пройти --enable-static --disable-shared
to configure
: это остановит создание динамических библиотек для libtooled пакетов. Возможно, вам придется установить некоторые пакеты изначально, а также скомпилировать их, если пакет должен запускать программу как часть строить.
иногда configure
's тесты не удастся: где он пытается скомпилировать и запустить программу, например. Часто эти тесты устанавливают переменную кэша, которую вы также можете передать в командной строке в configure
. Аналогично, вы можете переопределить такие вещи, как пути программы и флаги компиляции/ссылки библиотеки. Проверьте ваш пакет ./configure --help
.
нет абсолютно никаких проблем в построении против кросс-скомпилированных общих библиотек, если вы гарантируете, что вы строите против заголовков и библиотек для целевой системы, а не хоста разработки.
даже если вы построили все очевидные зависимости как статические библиотеки, вы, вероятно, все равно обнаружите связь с общими библиотеками среды выполнения языка C и c++. Вы также хотите быть уверены, что заголовочные файлы, используемые для кросс-компиляции те от вашей целевой системы, а не от хоста разработки.
Не делать этого, вероятно, будет работать большую часть времени. В оставшееся время вы получите тонкие сбои, трудно отлаживаемые.
Как вы достигаете этого, зависит от того, как ваша перекрестная цепочка инструментов и целевая среда. Как вы уже упоминали, я предполагаю, что это GCC и некоторый вкус Linux в качестве хоста и цели разработки , хотя принципы применяются одинаково к использованию других разработок принимать гостей.
перекрестная компиляция распределений GCC и Bin-utils обычно строится так, чтобы пути поиска библиотеки и заголовка по умолчанию указывали на копию корневой файловой системы целевой системы. Здесь компоновщик будет искать общие библиотеки для ссылок, и именно здесь вы устанавливаете свои зависимые общие библиотеки при их построении.
вы можете переопределить системный корень GCC по умолчанию, передав --sysroot <mySysRoot>
опция для GCC в командной строке.
вам нужно создать статические библиотеки для всех зависимостей и статически связать их с исполняемым файлом. Вам нужно будет использовать кросс-компилятор для создания этих библиотек. Вы можете найти несколько хороших примеров, посмотрев "MinGW static link cross compile"