2013-04-07 3 views
2

эти сомнения начали приходить ко мне, когда я читаю разделяемую библиотеку.Как изменить версию lib уже скомпилированного двоичного файла

1 .----------------- -------------------------- Предположим, что я уже скомпилирован, как показано ниже,

test : main.o libtest.so.2 
    gcc main.o -L ../../lib -ltest -o test 
libtest.so.2 : version2.c 
    gcc -Wall -fPIC -c version2.c 
    gcc -shared -Wl,-soname,libtest.so -o libtest.so.2.0 version2.o 
    ln -sf libtest.so.2.0 libtest.so 
    mv libtest.s* ../../lib 
main.o : main.c 
    gcc -c main.c 

придав -ltest, библиотека должна всегда быть мягкой ссылкой на libtest.so. Верный ? Так что, если я поеду на более высокую версию libtest для другого двоичного кода, а первая нуждается в старой версии? Как я могу справиться с этим.

2 .-------------------------------------------- ----------------------------- У меня есть несколько библиотек, и я не хочу включать их в LD_LIBRRAY_PATH, так как каждый должен будет найдите эту папку, которая будет полностью релевантна им.

ответ

0

1.You необходимо установить версию с -soname:

gcc -shared -Wl,-soname,libtest.so.2 -o libtest.so.2.0 version2.o 

Затем компоновщик будет связываться с бывшим с "libtest.so.2", а не "любой версии" libtest.so.


2.Set LD_LIBRARY_PATH только при запуске приложения, вы можете создать скрипт:

LD_LIBRARY_PATH=/path/to/your/libs ./my_app 
+0

Ответ на 2 ясно мне. tx Для 1. мой вопрос в том, что если я скомпилирован так, как я показал раньше, так как я не ожидал обновления, а позже я иду на обновление. Я соглашаюсь на ваш ответ, если я перекомпиляю основной, я могу сделать это, как показано ниже, правильно? gcc -shared -Wl, -soname, libtest.so.2 -o libtest.so.2.0 version2.o – adarsh

+0

Symlink "libtest.so" -> "libtest.so.2.0" предназначен только для разработки. Когда ваше приложение связано с «libtest.so», компоновщик записывает зависимость, записанную из soname из «libtest.so.2.0». Это будет «libtest.so.2». Когда вы начнете загрузку приложения, вы будете искать то, что вам нужно, и найдете «libtest.so.2» (symlink или real lib), который также может указывать на любой из «libtest.so.2.X» (то есть бинарно- совместимый). Когда вы создадите «libtest.so.3.0», прежний будет по-прежнему связан с «libtest.so.2». – loentar

+0

есть работа вокруг без компиляции. – adarsh

Смежные вопросы