Создание фиктивного общего объекта (.so) для зависимости от других общих объектов - PullRequest
4 голосов
/ 16 сентября 2009

Я пытаюсь создать общий объект (.so), который сделает это так, включив один общий объект с -lboost, я неявно включаю все библиотеки повышения. Вот что я попробовал:

#!/bin/sh
BOOST_LIBS="-lboost_date_time-gcc43-mt -lboost_filesystem-gcc43-mt"
  #truncated for brevity
g++ $BOOST_LIBS -shared -Wl,-soname,libboost.so.1 -o libboost.so.1.0
ln -si libboost.so.1.0 libboost.so.1
ln -si libboost.so.1 libboost.so

После помещения всех 3 созданных файлов (libboost.so libboost.so.1 libboost.so.1.0) в один каталог со всеми библиотеками boost, я попытался с его помощью скомпилировать тестовую программу (которая зависит от -lboost_date_time-gcc43-mt) :

g++ -lboost test.cpp

При этом я получил то же неопределенное справочное сообщение, что и без -lboost. Имея -lboost_date_time-gcc43-mt works, но это слишком многословно :) Как получить -lboost для автоматического добавления других общих библиотек?

Ответы [ 3 ]

1 голос
/ 16 сентября 2009

У меня нет решения для создания фиктивного '.so', но у меня есть кое-что, что упростит вашу жизнь ... Я настоятельно рекомендую вам попробовать использовать кросс-платформенный make ( CMake ). В CMake связываться с этими библиотеками просто:

FIND_PACKAGE(Boost 1.37 COMPONENTS date_time filesystem REQUIRED)
ADD_EXECUTABLE(myexecutable ${myexecutable_SRCS}) 
TARGET_LINK_LIBRARIES(myexecutable ${Boost_LIBRARIES}) 

Команды выше, если они помещены в файл "CMakeLists.txt", это все, что вам нужно:

  1. Убедитесь, что установлен Boost 1.37 или более поздней версии с установленными библиотеками "date_time" и "filesystem".
  2. Создайте исполняемый файл с именем «myexecutable» из источников, перечисленных в соответствующей переменной.
  3. Свяжите исполняемый файл "myexecutable" с расширенными библиотеками "date_time" и "filesystem".

См. Также: Почему проект KDE перешел на CMake .

1 голос
/ 18 сентября 2009

На самом деле, сделать одну .so зависимой от всех файлов Boost .so вполне возможно (но на самом деле не может вам помочь). Я только что попробовал это:

$ export BOOST_ROOT=/home/ghost/Work/Boost/boost-svn
$ g++ -shared -Wl,-soname,libboost.so -o libboost.so $BOOST_ROOT/stage/lib/libboost_program_options.so
$ g++ -L . -I $BOOST_ROOT first.cpp -lboost -Wl,-R$BOOST_ROOT/stage/lib
$ LD_LIBRARY_PATH=.:$BOOST_ROOT/stage/lib ./a.out

И это сработало. Тем не менее, обратите внимание, что танцы с -R и LD_LIBRARY_PATH. Я не знаю, как вы можете включить путь к Boost .so внутри вашего libboost.so, чтобы они использовались как для связывания, так и для фактического запуска приложения. Я могу просто включить rpath в libboost.so, но он игнорируется при разрешении символов для приложения.

1 голос
/ 16 сентября 2009

Ты не. Во всяком случае, не совсем.

Компоновщик удаляет все символьные зависимости, потому что .so их не использует.

Вы можете обойти это, возможно, написав скрипт компоновщика , который объявляет все необходимые символы как EXTERN() зависимости. Но это подразумевает, что вам нужно будет перечислить все искаженные имена для нужных вам символов. Не стоит усилий, ИМО.

...