Настройте CMake, чтобы следовать символической ссылке - PullRequest
0 голосов
/ 12 июня 2018

В Linux рассмотрим наличие файла test.so.Во время выполнения требуется другой файл .so (например, alpha.so, beta.so, charlie.so).В основном это общая библиотека.Когда я запускаю следующую команду в терминале:

$ ldd test.so

был отображен следующий вывод:

alpha.1.4.so ==> usr/lib/x86-linux-gnu/alpha.1.4.so
beta.1.4.so ==> usr/lib/x86-linux-gnu/beta.1.4.so
charlie.1.4.so ==> usr/lib/x86-linux-gnu/charlie.1.4.so

Я хочу изменить cmake, который используется для сборки test.so, чтобы указатьна символическую ссылку, например,

alpha.so ==> usr/lib/x86-linux-gnu/alpha.1.4.so
beta.so ==> usr/lib/x86-linux-gnu/beta.1.4.so
charlie.so ==> usr/lib/x86-linux-gnu/charlie.1.4.so

, а не на привязку к конкретной версии этой библиотеки (alpha.1.4.so, beta1.4.so, charlie.1.4.so).

Как мне изменить мойКонфигурация CMake, чтобы файл test.so соответствовал символической ссылке, а не конкретной версии?Я в основном хочу сделать его независимым от версии.

Ответы [ 2 ]

0 голосов
/ 11 апреля 2019

Решение @Tsyvarev подойдет для динамической библиотеки, в которой SO_NAME не содержит версии.

Но в моем случае SO_NAME файла .so содержит номер версии.Хотя не рекомендуется иметь номер версии в SO_NAME, некоторые библиотеки это делают.Я изменил файл .so с помощью команды patchelf в linux.

patchelf --set-soname dynamic_lib.so dynamic_lib.so.version_number

Это изменит SO_NAME библиотеки.

0 голосов
/ 12 июня 2018

Для отключения soname часть в связывании библиотеки, установите NO_SONAME свойство:

set_target_properties(<library-target> PROPERTIES NO_SONAME OFF)

Вы можете использовать эту команду для каждой цели библиотеки, созданной в вашемпроект или используйте его один раз, перечислив все целей , к которым он должен быть применен:

# Collect all library targets somehow
set(LIBRARY_TARGETS <library-target1> <library-target2> ...)
# And set the property for all of them
set_target_properties(${LIBRARY_TARGETS} PROPERTIES NO_SONAME OFF)

Они сказали, что есть переменная CMAKE_SHARED_LIBRARY_SONAME_C_FLAG , которая влияетна все цели.Но похоже, что эта переменная работает только в скриптах инструментария, а не после них.

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