Создание и использование общих библиотек с помощью bjam

Используя bjam в Ubuntu, я создаю общую библиотеку С++ и пытаюсь использовать ее в исполняемом файле. Я должен построить как общий, так как он не будет ссылаться как статический (возникает много неопределенных ссылок). Хорошо.

Две связанные проблемы:

1) Используя иерархию Jamfiles, мой исполняемый проект (testServerHub) зависит от общей библиотеки (pythonManager). Вот Jamfile для exe:

echo "Compiling serverHub//test" ;

# declare project name
project serverHub//testServerHub
    : build-dir ../_gcc/intermediate 
    ;

# build unit-test using these source files, dependent libraries and settings
exe testServerHub
    : # Source
      ..\\..\\..\\common\\0_8_1\\test\\runner.cpp
      successfulTest.cpp

      # Dependent libraries by path and project name
      ../controller/pythonManager//pythonManager 
      /boost//unit_test_framework

    : # Settings
      <link>shared
    ;

install ..\\bin : testServerHub ; 

И вот мой lib Jamfile:

echo "Compiling serverHub/controller//pythonManager" ;

# declare project name
project serverHub/controller//pythonManager     
    : requirements 
      <define>URTH_SERVERHUB
    : build-dir ../../_gcc/intermediate 
    ;

# build library using these source files and settings
lib pythonManager 
    : ../../../../common/0_8_1/controller/pythonManager/pythonManager.cpp
      ../../../../common/0_8_1/controller/pythonManager/cppInterfaceBase.cpp
      cppInterfaceServerHub.cpp
      /boost/python//boost_python
      /user-config//python
    : <link>shared
    ;

# copy and rename
install ../../lib : pythonManager ; 

Если я запускаю «bjam pythonManager», общая библиотека pythonManager создается и копируется в папку lib моего проекта (с помощью окончательной команды установки). Однако, если я запускаю «bjam test», создаются и testServerHub, и pythonManager, но libpythonManager.so не копируется в папку lib проекта — команда установки не запускается!

2) Итак, в качестве временного обходного пути я сначала создаю libpythonManager.so, а затем собираю исполняемый файл testServerHub. И скомпилируй, и линкуй. Во время выполнения исполняемый файл жалуется, что не может найти libpythonManager.so. Неудивительно, поскольку компоновщик времени выполнения не знает о моей папке lib проекта. Как мне сказать ему искать общие библиотеки в определенном каталоге? или как мне установить libpythonManager.so в /usr/local/lib, если команда установки не влияет на сборку зависимых библиотек?

Спасибо большое

Si


person sipickles    schedule 22.01.2010    source источник
comment
Один из подходов заключается в использовании правила модульного тестирования вместо правила exe. В этом случае разделяемые библиотеки каким-то образом компонуются во время выполнения. Это не помогает моему основному исполняемому файлу. Как правильно это сделать в Linux?   -  person sipickles    schedule 22.01.2010


Ответы (1)


Я думаю, что вы могли бы использовать <install-dependencies>on в exe Jamfile, как в

install ..\\bin : testServerHub : <install-dependencies>on <install-type>LIB ;

Это установит все библиотеки (LIB), от которых зависит исполняемый файл.

См., например, http://www.boost.org/doc/tools/build/doc/html/bbv2/tasks/installing.html в качестве справки.

person Francesco    schedule 10.02.2010