URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 3674
[ Назад ]

Исходное сообщение
"Как слинковать в приложении статическую и динамическую библи..."

Отправлено Андрей , 02-Дек-04 17:14 
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`
.

Как побороть?

Спасибо.

ЗЫ Принимаются любые советы, вплоть до поменять местами параметры(уже менял), поскольку свои идеи уже на исходе.


Содержание

Сообщения в этом обсуждении
"Как слинковать в приложении статическую и динамическую библи..."
Отправлено gyn61 , 02-Дек-04 19:05 
Можно

$gcc -o myapp myapp.c ./libmylib.so -static `xml2-config --libs`

но при запуске программы каталог с libmylib.so должен быть текущим


"Как слинковать в приложении статическую и динамическую библи..."
Отправлено Андрей , 04-Дек-04 13:43 
>Можно
>
>$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

К чему это? Нет ли ещё идей?

В любом случае спасибо огромное. Хоть какая-то новая информация. Буду искать.


"Как слинковать в приложении статическую и динамическую библи..."
Отправлено gyn61 , 04-Дек-04 16:06 
А что говорит ldd myapp

"Как слинковать в приложении статическую и динамическую библи..."
Отправлено Андрей , 04-Дек-04 16:27 
>А что говорит 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.

К чему это всё и как с этим бороться? У кого нить есть идеи?
Спасибо.


"Как слинковать в приложении статическую и динамическую библи..."
Отправлено Андрей , 09-Дек-04 18:36 
Господа. Если есть возможность -- помогите советом. Не знаю, что делать. Проблема остаётся открытой.

"Как слинковать в приложении статическую и динамическую библи..."
Отправлено Pablo , 09-Дек-04 18:52 
>Господа. Если есть возможность -- помогите советом. Не знаю, что делать. Проблема
>остаётся открытой.

попробуй при компиляции указать не -lxml2 а подсунуть ему libxml2.a
у меня он лежит в /usr/lib/


"Как слинковать в приложении статическую и динамическую библи..."
Отправлено Андрей , 09-Дек-04 19:40 
>>Господа. Если есть возможность -- помогите советом. Не знаю, что делать. Проблема
>>остаётся открытой.
>
>попробуй при компиляции указать не -lxml2 а подсунуть ему libxml2.a
>у меня он лежит в /usr/lib/

Огромное спасибо. Вроде бы простой выход, а сам не догадался. Похоже это то, что нужно.
Ещё раз огромное спасибо.