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 вручную, если вы планируете использовать статические библиотеки.
Ответ 2
Существует очень простая процедура для перекрестного повышения сборки от linux к окнам здесь:
https://web.archive.org/web/20110604002004/http://www.vle-project.org/wiki/Cross_compilation_Win32
Ответ 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 и т.д. с вашей сборкой, что должно быть огромным преимуществом.