Я создаю две общие библиотеки, одна библиотека (B) зависит от другой (A), и обе создаются с rpath
из $ORIGIN/.
, затем связываю исполняемый файл с библиотекой B. Таким образом, зависимостиследующим образом:
исполняемый файл C -> библиотека B -> библиотека A
В Ubuntu зависимость B от A разрешается с помощью его rpath
, тогда как в CentOS компоновщик предупреждает, что A не можетнайти, и я должен использовать «попробуйте использовать -rpath
или -rpath-link
» во время компиляции исполняемого файла.
Вот минимальный пример, чтобы воспроизвести проблему:
mkdir testdir
echo 'void a() {}' > testdir/a.c
echo 'int a(); void b() { a(); }' > testdir/b.c
echo 'int b(); int main() { b(); }' > testdir/c.c
gcc testdir/a.c -shared -o testdir/liba.so -Wl,-rpath,'$ORIGIN/.' -fPIC
gcc testdir/b.c -Ltestdir -la -shared -o testdir/libb.so -Wl,-rpath,'$ORIGIN/.' -fPIC
gcc testdir/c.c -Ltestdir -lb -o testdir/a.out
Какая разницамежду связыванием поведения в Ubuntu и CentOS вызывает эту проблему?Есть ли способ, которым я могу «исправить» это, так что A будет разрешен без необходимости полагаться на такие вещи, как LD_LIBRARY_PATH
?
Обновление: Если я используюабсолютный путь к каталогу библиотеки вместо $ORIGIN
, это похоже на работу.Конечно, я не знаю абсолютного пути, куда они будут развернуты, поэтому это не решает эту проблему, но указывает на то, что $ORIGIN
не поддерживается CentOS 7 (или его загрузчиком).