Как вы статически связываете только библиотеки Boost? - PullRequest
6 голосов
/ 05 мая 2011

У меня есть проект, который ссылается на различные общие библиотеки, а также на Boost.Тестирование этого на компьютерах, отличных от моего, оказалось трудным, поскольку различные версии Linux поставляются с разными версиями Boost.Я бы предпочел не загружать и компилировать одну и ту же версию Boost на каждой машине.

Есть ли способ статически связать мою программу только с библиотеками Boost, а все остальное связать нормально?Я пытался связать все статически (-static), но это вызывает другие проблемы (а именно lGL не найден).Есть ли другой потенциальный способ, которым я мог бы упаковывать только необходимые динамические библиотеки с моей программой (скажем, в той же папке, что и исполняемый файл) и распространять ее таким образом?

Ошибка связи при попытке связать все статически:

g++ -static -o"acmserver"  ./src/acmserver.o ./src/airplane.o ./src/bullet.o ./src/control.o ./src/detail.o ./src/game.o ./src/gamelog.o ./src/gamelogitem.o ./src/guns.o ./src/map.o ./src/missile.o ./src/missilepod.o ./src/object.o ./src/server.o   -lboost_system -lboost_filesystem -lboost_thread -lboost_serialization -lboost_date_time -lpthread -lGLU -lGL
/usr/bin/ld: cannot find -lGL
collect2: ld returned 1 exit status
make: *** [acmserver] Error 1

РЕДАКТИРОВАТЬ (РЕШЕНИЕ):

count0 упомянул именно то, что я искал.В Eclipse я удалил все библиотеки Boost (например, boost_system) из формы Проект -> Свойства -> Сборка C / C ++ -> Настройки -> GCC C ++ Linker -> Библиотеки -> Библиотеки (-l).Затем я добавил файлы Boost .a (например, /usr/lib/libboost_system.a) в разделе Проект -> Свойства -> Сборка C / C ++ -> Настройки -> GCC C ++ Linker -> Разное -> Другие объекты.Я также удалил "-static" из флагов компоновщика.В результате получился исполняемый файл со всеми библиотеками boost, связанными статически, а не динамически.

Ответы [ 2 ]

7 голосов
/ 05 мая 2011

Используйте улучшенные архивные файлы (.a файлы) вместо общих файлов lib (.so или, кроме того, связывание с -l). Вы динамически связываете эти библиотеки повышения прямо сейчас. Запись этого может помочь убедиться, что статически связано, а что динамически.

Это будет выглядеть примерно так:

g++ -o"acmserver"  ./src/acmserver.o ... ./src/server.o \
  /usr/local/lib/libboost_system.a /usr/local/lib/boost_filesystem \
  ... -lGL ...

В зависимости от версии gcc или типа платформы вам также может понадобиться добавить флаг -static`.

0 голосов
/ 05 мая 2011

Эта ошибка говорит о том, что ваш компоновщик не нашел библиотеку GL, которая не имеет ничего общего с boost.

Убедитесь, что в вашей системе установлен libgl1-mesa-dev или эквивалентный пакет.

...