Как скомпилировать 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"