2011-05-04 3 views
4

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

Есть ли способ связать мою программу статически только с библиотеками Boost и иметь все, что связано нормально? Я попытался связать все статически (-статический), но это вызывает другие проблемы (а именно, 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 

EDIT (РАСТВОР):

count0 упоминается именно то, что я искал. В Eclipse я удалил все библиотеки Boost (например, boost_system) из Project -> Properties -> C/C++ Build -> Settings -> GCC C++ Linker -> Библиотеки -> Библиотеки (-l). Затем я добавил файлы Boost .a (например, /usr/lib/libboost_system.a) в разделе Project -> Properties -> C/C++ Build -> Settings -> GCC C++ Linker -> Разное -> Другие объекты. Я также удалил «-статический» из флагов компоновщика. Это создало исполняемый файл со всеми добавочными библиотеками, связанными статически, а не динамически.

ответ

6

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

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

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

Именно это я и искал! Мне просто пришлось удалить -статический "и добавить файлы .a. – JuiceboxHero

+0

Правильно, что -статический должен идти, мой плохой. – count0

0

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

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

+0

Шахта расположена по адресу: '/ USR/Lib/libGL.so' – karlphillip

+0

Да, сэр, это установлен. При динамическом соединении все работает хорошо. Но когда я бросаю этот -статический флаг там, он терпит неудачу с вышеупомянутой ошибкой. Вот почему я хотел бы просто статически связать Boost и не беспокоиться о lGL. – JuiceboxHero

+0

Если он установлен в системе, добавьте путь к библиотеке на вашей линии компиляции, она станет примерно такой: '-L/usr/lib -lGL' – karlphillip

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