2010-04-26 2 views
5

Я хочу построить свою программу с помощью компилятора LSB C++ из базовой базы Linux http://www.linuxfoundation.org/collaborate/workgroups/lsb. Программа зависит от библиотеки Boost, построенной с версией gcc 4.4. Компиляция не удалась. Возможно ли создать библиотеку Boost с помощью компилятора LSB C++? В качестве альтернативы можно ли построить библиотеку Boost с некоторой старой версией gcc, какую версию рекомендуется? Моя конечная цель - получить мои исполняемые и сторонние библиотеки Boost для большинства дистрибутивов Linux.Building Boost с компилятором LSB C++

Как правило, что можно улучшить для бинарной совместимости для дистрибутивов Linux, разрабатывая приложение с открытым кодом C++ в зависимости от библиотеки Boost?

+0

С каких пор LSB является компилятором? Я думал, что это просто спецификация того, какие библиотеки и утилиты должны быть установлены и доступны в дистрибутиве Linux (так что другие библиотеки и утилиты могут зависеть от их присутствия). –

+0

Michael Aaron Safyan: проект LSB предоставляет свой собственный компилятор C++, который можно использовать вместо GCC, и должен создавать двоичные файлы, совместимые со всеми дистрибутивами Linux. Действительно, использование этого компилятора для моего собственного кода дает хорошие результаты. Однако у меня проблемы с сторонними библиотеками, используемыми в моем проекте. –

+0

@Michael, LSB - это набор спецификаций, но рабочая группа также предоставляет инструменты, которые помогают разрабатывать программы, соответствующие этим спецификациям. См. Здесь http://ldn.linuxfoundation.org/lsb/porting-lsb-demo и здесь http://www.linuxfoundation.org/collaborate/workgroups/linux-standard-base-lsb/lsb-sdk-403 –

ответ

3

Компилятор LSB C++ на самом деле не является компилятором. Исполняемый файл lsbc++ является оберткой вокруг компилятора GCC, который установлен в вашей системе (фактический компилятор можно контролировать с помощью опции --lsb-cxx). Вы, скорее всего, взломаете систему форсирования сборки, чтобы она вызывала оболочку LSB вместо собственного компилятора gcc.

Таким образом, проблемы, которые могут возникнуть, скорее всего, не будут заключаться в том, что компилятор LSB не может скомпилировать языковые конструкции, а вместо этого есть некоторые проблемы с связыванием.

Например, компилятор LSB по умолчанию отбрасывает любые общие библиотеки, с которыми связан код, если только они не принадлежат к LSB. Это может привести к связыванию ошибок, если BOOST опирается на такие библиотеки. Это можно контролировать с помощью переменной окружения LSBCC_SHAREDLIBS, но вы должны убедиться, что вы отправляете эти библиотеки вместе с вашим продуктом.

Другая проблема заключается в том, что LSB отстает от выпусков компилятора GCC (и BOOST может сканировать все темные углы компиляторов). Насколько я знаю, GCC 4.4 недостаточно проверен, поэтому лучше попробовать его с 4.3-компилятором.

И Google, похоже, не находит ничего связанного с наращиванием здания с помощью LSBCC, поэтому, если вам удастся это сделать, делитесь своим опытом, например, своим собственным ответом на свой вопрос.

+0

Я попытался построить Boost, заменив файл g ++ ссылкой на lsbC++. Результатом стало то, что компиляция многих библиотек не удалась. Я попробую GCC 4.3 версию, спасибо за эту информацию. –

+0

@Alex, я надеюсь, что наряду с заменой ссылки вы также указали 'lsbC++' на настоящий компилятор, поэтому он не рекурсировал: -D. В любом случае, вы также можете попытаться получить помощь в списке рассылки LSB: https://lists.linux-foundation.org/mailman/listinfo/lsb-discuss Формат рассылки более подходит для обсуждения конкретных ошибок с журналами ошибок, чем StackOverflow , –

+0

Использование GCC 4.3 не помогло, я до сих пор не могу использовать компилятор lsbC++ для сторонних библиотек. Тем не менее, у меня есть некоторые результаты с LSB Application Checker. Добавив недостающие библиотеки в свой пакет, мне удалось получить 49 из 50 совместимых дистрибутивов Linux для программы, используя библиотеку Boost ASIO. Вид успеха ... Спасибо за вашу помощь. –

6

Я недавно был позвонить, чтобы сделать это, в том случае, если это использование кому-либо эти шаги я последовал:

  • Скачать и установить LSB SDK
  • Скачать версию увеличить и извлечь в/opt/boost/boost_ < версия > (я использовал 1.43)
  • Убедитесь, что установлен libbz2-dev.
  • Bootstrap с
cd /opt/boost/boost_<version> 
./bootstrap.sh --prefix=/opt/boost --without-libraries=python,mpi --without-icu 
  • Edit /opt/boost/boost_<version>/project-config.jam и добавьте строку
using gcc : : /opt/lsb/bin/lsbc++ : <cflags>-U_GNU_SOURCE <cxxflags>-U_GNU_SOURCE ; 

в верхней части файла. Обратите внимание, что это произойдет, если у вас есть объявление использования в одном из других файлов, с которого bjam считывает свою конфигурацию, вы можете передать --debug-configuration, чтобы узнать, какие файлы он читает.

  • Run
./bjam cflags=-fPIC cxxflags=-fPIC linkflags=-fPIC install 

Я не пытался получить либо питон или библиотеки MPI работает, и я не пытаюсь получить ICU работать с библиотекой библиотеки Boost.regex. Последнее, вероятно, относится к созданию статических версий библиотек ICU с помощью набора инструментов LSB.

-fPIC не является строго необходимым для 32-разрядной Linux, но необходим, если вы хотите связать статические библиотеки с общей библиотекой для 64-разрядной Linux.

Конечный результат должен быть двоичным кодом в /opt/boost/lib и заголовками в /opt/boost/include, очевидно, вы можете изменить префикс в соответствии с вашими предпочтениями. У меня все еще есть достаточная работа, прежде чем я портировал весь наш код в LSB, поэтому я не могу сообщить, насколько хорошо процесс сертификации еще продолжается.

+0

Интересно, спасибо. В настоящее время я использую автоматические инструменты для решения проблемы с двоичной совместимостью. Я сохраню ваш ответ для дальнейшего использования. –

 Смежные вопросы

  • Нет связанных вопросов^_^