Hi, all.
Собственно вопрос в следующем. Как слинковать в одно приложение статическую и динамическую библиотеки?Ситуация такая. Есть приложение myapp.c ему нужна для работы моя библиотека libmylib.so and libxml2.so. При этом libmylib.so должна линковаться динамически и находиться в том же каталоге, что и myapp, а libxml2.so должна быть вкомпилена в myapp статически. До того, как я сделал libmylib.so, я работал с libxml2, и линковал её как динамически:
$gcc -o myapp myapp.c `xml2-config --libs`
, так и статически
$gcc -o myapp myapp.c -static `xml2-config --libs`
.
libmylib.so я тоже могу слинковать динамически. При попытке добавить ключ -static, линкер говорит, что lmylib не найдена, что, как я понимаю, правильно, т.к. у меня нет libmylib.a.Обе библиотеки я могу скомпоновать динамически:
$gcc -c -o myapp.o myapp.c
$gcc -o myapp myapp.o -L. -lmylib -Wl,-rpath,./ `xml2-config --libs`Но при попытке слинковать libmylib.so динамически, а libxml2 статически, я получаю Segmentation failed при запуске myapp, хотя компоновка проходит без проблем:
$gcc -c -o myapp.o myapp.c
$gcc -o myapp myapp.o -shared -L -lmylib -Wl,-rpath,./ -static `xml2-config --libs`
.Как побороть?
Спасибо.
ЗЫ Принимаются любые советы, вплоть до поменять местами параметры(уже менял), поскольку свои идеи уже на исходе.
Можно$gcc -o myapp myapp.c ./libmylib.so -static `xml2-config --libs`
но при запуске программы каталог с libmylib.so должен быть текущим
>Можно
>
>$gcc -o myapp myapp.c ./libmylib.so -static `xml2-config --libs`
>
>но при запуске программы каталог с libmylib.so должен быть текущимСпасибо, но не помогает:(. при компиляции-линковке всё ок, но при запуске:
-bash: ./myapp: /usr/lib/libc.so.1: bad ELF interpreter: No such file or directory
К чему это? Нет ли ещё идей?
В любом случае спасибо огромное. Хоть какая-то новая информация. Буду искать.
А что говорит ldd myapp
>А что говорит ldd myapp
Тоже самое.
[root@websitebuilder work]# ldd myapp
/usr/bin/ldd: ./myapp: /usr/lib/libc.so.1: bad ELF interpreter: No such file or directoryТам (in /usr/lib) есть libc.so, но нет никакого libc.so.1:(, я гуглил по кейворду : /usr/lib/libc.so.1: bad ELF interpreter: No such file or directory, но ничего, кроме идеи сделать ссылку на эту либу (libc.so) и обозвать её(ссылку) lib.so.1 не нашёл. Но это не помогает. Он говорит
-bash: ./myapp: Accessing a corrupted shared library.К чему это всё и как с этим бороться? У кого нить есть идеи?
Спасибо.
Господа. Если есть возможность -- помогите советом. Не знаю, что делать. Проблема остаётся открытой.
>Господа. Если есть возможность -- помогите советом. Не знаю, что делать. Проблема
>остаётся открытой.попробуй при компиляции указать не -lxml2 а подсунуть ему libxml2.a
у меня он лежит в /usr/lib/
>>Господа. Если есть возможность -- помогите советом. Не знаю, что делать. Проблема
>>остаётся открытой.
>
>попробуй при компиляции указать не -lxml2 а подсунуть ему libxml2.a
>у меня он лежит в /usr/lib/Огромное спасибо. Вроде бы простой выход, а сам не догадался. Похоже это то, что нужно.
Ещё раз огромное спасибо.