boost распространяется с закрытой исходной библиотекой - PullRequest
7 голосов
/ 28 января 2011

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

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

Ответы [ 3 ]

1 голос
/ 16 июня 2011

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

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

0 голосов
/ 24 июня 2011

Как API-интерфейс связан с библиотекой Boost, которую они использовали?Они развернули надстройку - ##. Так с ним, или он был статически связан?

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

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

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

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

0 голосов
/ 02 февраля 2011

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

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

...