как решить конфликт версий, возникающий из-за включения нескольких версий библиотеки в Linux

В своем проекте я пытаюсь использовать две библиотеки, которые уже скомпилированы и сгенерированы. Скажем, liba.so (наша собственная библиотека, созданная когда-то назад) и libssl.so.10 (она доступна в Linux).

Теперь liba.so имеет зависимость от libcurl.so.3, а libssl.so.10 имеет зависимость от libcurl.so.4 (последняя)

В системе доступны как libcurl.so.3, так и libcurl.so.4.

Следовательно, когда я пытаюсь использовать их оба в своем проекте, у меня возникает конфликт версий. Это ожидается? Если да, то как мне решить эту проблему?

Есть ли способ изменить зависимость liba.so с последней версией libcurl.so.4 без повторной сборки этой библиотеки? Или мне нужно собрать liba.so снова с последней версией libcurl.so.4?

Спасибо за вашу помощь


person Jegan    schedule 26.02.2014    source источник


Ответы (1)


Следовательно, когда я пытаюсь использовать их оба в своем проекте, у меня возникает конфликт версий. Это ожидается? Если да, то как мне решить эту проблему?

Есть два решения.

Во-первых, вы должны носить с собой версии libcurl.so и libssl.so, которые хотите использовать. Затем вы должны использовать rpath или LD_LIBRARY_PATH компоновщика, чтобы убедиться, что вы загружаете общие объекты, которые вы включили.

Во-вторых, вы должны создать liba.so для статической связи с libcurl и libssl.

Если вы работаете на Android, то номер два — ваш выбор. Это связано с тем, что OpenSSL включен в Android, zygote загружает его, и вы всегда получаете более раннюю версию 0.9.8 после форка от zygote.

На Android вам даже нужно было бы создать общий объект-оболочку, если все, что вам нужно, это современный OpenSSL, такой как 1.0.1 (это очень похоже на то, что вы испытываете с libcurl.so.3 и libcurl.so.4).

person jww    schedule 26.02.2014
comment
В первом решении у меня есть обе библиотеки (libcurl.so.3 и libcurl.so.4) в одном каталоге. Следовательно, если я укажу местоположение каталога в rpath или LD_LIBRARY_PATH, по умолчанию это приведет к конфликту. Так вы хотите сказать, что мне нужно явно указать версию? Во втором решении могу ли я статически связать старый libcurl.so.3 с liba.so и динамически использовать последний libcurl.so.4 с libssl.so.10 в моем проекте? - person Jegan; 26.02.2014
comment
К вашему сведению, это не Android. Это сервер разработки RedHat. - person Jegan; 26.02.2014
comment
libcurl.so.3 и libcurl.so.4, вероятно, несовместимы в бинарном режиме (отсюда и причина скачка версии). Вам нужно будет скомпилировать все для одних и тех же версий или выполнить статическую компоновку, чтобы устранить проблему с несовместимыми ABI. Если динамический компоновщик сначала загружает libcurl.so.3, то пострадает зависимый от libcurl.so.4 (и наоборот). - person jww; 26.02.2014
comment
Спасибо за ваши ответы. - person Jegan; 26.02.2014