Boost - cross compile - "от Linux" до Windows "

Я загрузил исходный код "boost" (1.40.0) со своей домашней страницы "www.boost.org". У меня установлен Linux (Ubuntu 9.04 Jaunty) и пытается скомпилировать библиотеки boost в версию "WINDOWS" (например, ".dll", а не ".so" ) с моей машины "LINUX".

И теперь важный вопрос:

ЭТО ВОЗМОЖНО СОСТАВИТЬ В БИБЛИОТЕКИ "WINDOWS" BOOST из "LINUX" (если кто-то скажет "да", я доверяю ему, только если он уже сделал это раньше, напишет здесь решение, которое будет работать для меня. Извините за этот пессимизм, но я пытаюсь сделать это в течение 3 дней и ничего не позитивно до сих пор) ?

До сих пор я скомпилировал С++-программы таким образом. Для компиляции из Linux в Linux я использовал компилятор "gcc" (или "g++" ). Для компиляции из Linux в Windows я использовал компилятор "i586-mingw32msvc-gcc" (или "i568-mingw32msvc-g++" ) (который содержится, например, в пакете "mingw32" для "Ubuntu" ).

Итак, эта стратегия, которую я хотел использовать, также для компиляции ускорительных библиотек, и я пробовал это до сих пор (прочитав статью "Начало работы" на главной странице):

- 1. Я запустил "bootstrap.sh" из каталога корневого исходного кода ускорения:

./bootstrap.sh

- 2. Затем я изменил одну вещь в файле "project-config.jam" (из "using gcc;" ):

using gcc : : i586-mingw32msvc-gcc ;

- 3. И, наконец, выполните исполняемый файл "bjam":

./bjam stage

Но вместо создания "Windows" версии библиотек boost я получил много сообщений об ошибках.

Может кто-нибудь мне помочь?

Спасибо заранее.

Petike

Ответы

Ответ 1

В официальной документации есть раздел кросс-компиляция. Сравнивая это с тем, что вы делаете, возникают две проблемы:

  • Вы указываете i586-mingw32msvc-gcc и должны указывать i586-mingw32msvc-g++. Первый - компилятор C, который немного сложно использовать для компиляции кодовой базы С++; -)

  • Вам нужны target-os = windows

Обратите внимание, что там есть одна известная ошибка - при создании статических библиотек они не передаются через ranlib, и mingw linker особенно расстроен по этому поводу. Вам нужно будет запустить runlib вручную, если вы планируете использовать статические библиотеки.

Ответ 3

Это команды, которые я использую. Я тестировал их для повышения 1.46 и 1.49.

Для начала создайте ссылки на компилятор внутри /usr/i 686-w64-mingw32/bin. Вы можете запустить этот script:

#!/bin/bash

binDir="/usr/bin"
destDir="/usr/i686-w64-mingw32/bin"

cd "$binDir"
mkdir -p "$destDir"

for name in $(ls i686-w64-mingw32*); do
    newName=$(echo "$name" | sed 's/i686-w64-mingw32-//g')
    if [ -f "$destDir/$newName" ]; then
        rm "$destDir/$newName"
    fi
    ln -s "$binDir/$name" "$destDir/$newName"
done

Затем установите bjam. На ubuntu/debian он включен в пакет "libboost1.48-dev"

apt-get install libboost1.48-dev

Чтобы закончить, станьте root и запустите

env PATH=/usr/i686-w64-mingw32/bin:$PATH bjam toolset=gcc target-os=windows variant=release threading=multi threadapi=win32 link=static --prefix=/usr/i686-w64-mingw32 -j 4 --without-mpi --without-python -sNO_BZIP2=1 -sNO_ZLIB=1 --layout=tagged install

Готово!

Ответ 4

Boost делает предположения о вашей ОС и текущей сборке на основе вашей текущей системы. Что делать, если вы должны получить файлы заголовков win32, удалить все заголовки linux из пути include, а затем попытаться создать?

Ответ 5

На самом деле это не ответ, но: do not!

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

Если вы пытаетесь создать двоичные файлы Windows на одном компьютере, скажем, для упаковки, используйте виртуальную машину с окнами, mingw и соответствующими скриптами.

Тогда вы можете даже запустить автоматические тесты на vm и т.д. с вашей сборкой, что должно быть огромным преимуществом.