Сборка Boost с помощью LSB C ++ Compiler - PullRequest
5 голосов
/ 26 апреля 2010

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

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

Ответы [ 2 ]

6 голосов
/ 23 июля 2010

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

  • Загрузите и установите LSB SDK
  • Загрузите версию boost и распакуйте ее в / opt / boost / boost_ (я использовал 1.43)
  • Убедитесь, что libbz2-dev установлен.
  • Бутстрап с
cd /opt/boost/boost_<version>
./bootstrap.sh --prefix=/opt/boost --without-libraries=python,mpi --without-icu
  • Редактировать /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

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

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

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

3 голосов
/ 26 апреля 2010

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

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

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

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

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

...