LINUX.ORG.RU

Линковка двух библиотек с конфликтом имен

 ,


0

1

Есть 2 либы, у которых имеется один класс с одинаковым именем, но различной реализацией. Я эти либы собираю и линкую в свое приложение. Сборка проходит нормально, но происходит падение в рантайме, из-за того, что в одну либу подгружается реализация из второй либы, не совместимая с ней. Как принято решать такие проблемы? В либы я не могу влезть, ибо они сторонние и периодически обновляются.

из-за того, что в одну либу подгружается реализация из второй либы, не совместимая с ней.

как определил, что из-за этого?

если там нет extern C, то никакого конфликта нет

Elyas ★★★★★
()
Ответ на: комментарий от Elyas

Других предположений нет. Работало все нормально, подправил немного реализацию в одной либе и начало падать на коде, который использует другую либу.

panter_dsd ★★★★
() автор топика
Ответ на: комментарий от panter_dsd

Враппер вокруг С библиотек. Заворачиваешь библиотеку в свой класс, внутри класса dlopen нужной so'шки => профит! ;)

UVV ★★★★★
()
Ответ на: комментарий от UVV

Да у меня и так эти 2 либы линкуются в мою либу, которая предоставляет универсальный интерфейс к ним. Еще враперы пейсать я запарюсь. Тем более, одним классом там не ограничивается. :(

panter_dsd ★★★★
() автор топика
Ответ на: комментарий от Elyas

Мне нужно кроссплатформенное решение. Сейчас я через CMake собираю эти либы

add_library (${LIB_OUTPUT_NAME} SHARED ${SOURCES})
target_link_libraries (${LIB_OUTPUT_NAME})

И линкую к своей:

TARGET_LINK_LIBRARIES(
    ${TARGET}
    ${QT_LIBRARIES}
    ${AORP_LIBRARIES}
    ${CARRIDA_LIBRARIES}
    number                     !!!one
    RecogLib                   !!!two
    Utils
    Image
)
panter_dsd ★★★★
() автор топика
Ответ на: комментарий от panter_dsd

Кроссплатформенно не получится в этом случае, имхо. И думаю, что без враппера не обойтись. Ты реально много функций оттуда используешь?

UVV ★★★★★
()
Последнее исправление: UVV (всего исправлений: 1)
Ответ на: комментарий от UVV

Достаточно. Еще и эту структуру юзаю. Ща пробую в одной либе поместить структуру в нэймспейс. Если поможет, сделаю на питоне скрипт, который будет это делать автоматически при конфигурировании цмэйком.

panter_dsd ★★★★
() автор топика
Ответ на: комментарий от panter_dsd

Блин, походу, нашел ошибку. Я у себя в коде юзаю реализашку из второй либы, а первая либа юзает свою реализашку, вот и конфликт... Придется первую либу учить работать со второй. Блин, тяжко работать с чужим кодом, который пишут абы как.

panter_dsd ★★★★
() автор топика
Ответ на: комментарий от panter_dsd

В чём конфликт-то? Неясно. Сообщение об ошибке покажи, хоть. По идее, подобные конфликты можно разрулить тонкой настройкой линкера.

one_more_hokum ★★★
()

почитай тут: http://www.linuxjournal.com/article/3687
смысл в том, чтобы сделать функцию-фабрику классов. функцию можно сделать в маленьком враппере.

Iron_Bug ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.