boost распространяется с библиотекой с закрытым исходным кодом

У меня есть приложение, которое должно использовать определенный API C ++ с закрытым исходным кодом. Этот API распространяется с некоторыми битами Boost, файлами двоичных библиотек и всем остальным. Мне нравится использовать Boost в моем собственном коде. Я не могу просто использовать их версию Boost, поскольку они не распространяли все части Boost, которые мне нужны. Как мне продолжить? Целевая платформа - Linux, а в конечном итоге и Windows.

  • Я не буду передавать объекты Boost через границу API.
  • Я могу компилировать вещи в объектные файлы, чтобы мой код использовал заголовки Boost my, а код API использовал свои заголовки Boost. Эта часть кажется простой.
  • Чего я не получаю: как связать мой код с моими файлами библиотеки Boost, а код API - с его файлы библиотеки Boost. Нужно ли мне скомпилировать мою собственную оболочку вокруг API - оболочку, заголовки которой не включают Boost - в динамическую библиотеку ?? (Это единственный способ, который я могу придумать для связывания. Символы в файлах библиотеки Boost API должны быть идентичны символам в моих файлах библиотеки Boost. Я должен выполнить связывание в двух этапов, нет? Единственный способ связать одну часть программы без остальных - это создать динамическую библиотеку, не так ли?)

person Scott    schedule 28.01.2011    source источник
comment
Мне также приходится работать со сторонней библиотекой с закрытым исходным кодом. Они распространили свою собственную (действительно старую) версию Boost с библиотекой. К счастью, они переименовали свою библиотеку Boost, например, BoostSystem_x86-64_redhat_gcc41_mdi вместо boost_system. Каким-то образом мой код действительно строится.   -  person chrisaycock    schedule 28.01.2011
comment
@chrisaycock Вы используете Activ? У меня такое же имя файла! Но я подозреваю, что символы в этом файле имеют то же имя, что и символы в моей версии boost, а это значит, что мой Boost будет связан с ускорением Activ ... @KitsuneYMG Я до сих пор не получил ответа на эту проблему связывания .. . (даже если это сработает, я немного боюсь надеяться, что он продолжит работать ..)   -  person Scott    schedule 28.01.2011
comment
Да, это Activ! Я просто связываю их Boost и свой Boost. Я не уверен, что делает gcc для разрешения любых конфликтов, но система работает.   -  person chrisaycock    schedule 28.01.2011
comment
Какие части наддува вы используете?   -  person Foo Bah    schedule 02.02.2011
comment
Идеальным решением для этого является то, что и ваша сторонняя библиотека, и ваша библиотека компилируются в динамические библиотеки с версией, запеченной в имени файла.   -  person totowtwo    schedule 05.07.2011


Ответы (3)


Данный исполняемый файл может иметь только один фрагмент кода для каждого символа. Поэтому, если в их библиотеке используется символ foo из boost v. 1, а вы используете тот же символ из boost v. 2, то вы получите конфликт. Нет простого способа избавиться от этого столкновения без изменения символа. Должна быть возможность использовать динамическое выполнение, если вы смогли скомпилировать код повышения в динамическая библиотека, но это кажется излишним.

Поскольку в C ++ символ искажается своими пространствами классов / имен, вы также можете изменить одно из них, чтобы изменить символ.

person Dave    schedule 16.06.2011

Если вы используете только библиотеки повышения только для заголовков, вы можете просто создать свой код отдельно от кода, который связан с другими библиотеками.

Какие библиотеки ускорения вы используете?

person Foo Bah    schedule 02.02.2011
comment
Только заголовок или нет, это просто просьба нарушить ODR, поскольку разные версии Boost будут иметь разные определения различных типов и функций, как в пространстве имен boost. - person ildjarn; 05.07.2011

Как api связывается с используемой библиотекой boost? Разворачивают буст - ##. Так что с ним, или он был статически связан?

Итак, запустите «objdump -T api.so | grep boost» в своем api .so, чтобы проверить, предоставляет ли api Boost.

Кроме того, возможно, они переименовали пространство имен boost, как упомянул пользователь chrisaycock. Используйте команду c ++ filter, чтобы поближе познакомиться с символами, которые вы нашли с помощью «objdump -T api.so | grep boost».

Если он был статически связан и символы повышения не были показаны (или были переименованы), вы можете использовать ускорение в своем коде, не касаясь повышения API.

Если действительно есть буст, рекомендую просто попробовать буст. С вашим кодом, использующим ускорение, вероятно, не произойдет столкновения. Если это произойдет, вы можете скомпилировать новый буст и изменить свое имя пространства имен. Просто запустите сценарий replace-all, заменив «namespace boost» на что-то вроде «namespace boost_1_46».

person André Puel    schedule 24.06.2011