2010-11-14 5 views
2

Я пытаюсь изучить концепции разделяемой библиотеки в Linux с помощью GCC. Поэтому я создал простую библиотеку.Создание простой общей библиотеки

library.c

int foo(void) { 
    return 10; 
} 

Это скомпилированы с использованием,

cc -fPIC -g -c library.c 
cc -shared -fPIC -Wl,-soname,libmytest.so.1 -o libmytest.so.1.0.1 library.o -lc 

Он создал файл libmytest.so.1.0.1 в текущем каталоге. Теперь я пишу клиент, чтобы использовать эту библиотеку в том же каталоге.

client.c

#include <stdio.h> 

extern int foo(void); 

int main() 
{ 
    int a = foo(); 
    printf("a is %d", a); 
    return 0; 
} 

компиляции с использованием,

cc client.c -o client -lmytest 

, но это выходит с сообщением

/usr/bin/ld: cannot find -lmytest 
collect2: ld returned 1 exit status 

Может кто-нибудь помочь мне узнать, что я делаю Неправильно здесь?

ответ

4

Попробуйте использовать -L вариант, который используется для добавления каталога в список каталогов, которые искали вариант -l:

cc client.c -L. -o client -lmytest 

Предполагая .so присутствует в том же каталоге, client.c. Если не добавить подходящий путь.

Компонент при просмотре -lmytest ищет libmytest.so, но у вас есть номер версии, прилагаемый к нему, чтобы он не работал. Путь, чтобы исправить это, чтобы создать символическую ссылку с именем libmytest.so указывая на libmytest.so.1.0.1

ln -s libmytest.so.1.0.1 libmytest.so 

В качестве альтернативы вы можете использовать полное имя библиотеки на линии компиляции/сборки как:

cc client.c ./libmytest.so.1.0.1 -o client 
+0

Спасибо, но не повезло. по-прежнему такая же ошибка. Я даже пытался указать полный путь, но не работал. –

+0

Мне нужно запустить 'ldconfig'? –

+0

Я получил его работу, предоставив имя библиотеки напрямую, а не через -l. –

1

Компоновщик обычно выполняет поиск только системные пути для библиотек. Перейдите -L в gcc, чтобы указать дополнительные пути для поиска.

1

Вам не хватает опции -Ldir.

Из страницы руководства GCC:

-Ldir Add directory dir to the list of directories to be searched for -l. 

Вам также необходимо указать, где находится общая библиотека, если вы пытаетесь запустить исполняемый файл, в противном случае библиотека не будет найдена. Это может быть сделано с:

LD_LIBRARY_PATH=. ./client

Edit:

Спасибо, но не повезло.все тот же ошибка. Я даже пробовал с указанием полного пути, но не работал.

Я думаю, что компоновщику нужна библиотека для расширения .so. Попробуйте ln -s libmytest.so.1.0.1 libmytest.so и посмотрите, не связано ли оно.

+0

спасибо. которые решили проблему –

+1

В качестве альтернативы установке LD_LIBRARY_PATH каждый раз, когда вы запускаете исполняемый файл, вы можете установить «LD_RUN_PATH», когда вы его связываете, что добавит дополнительный путь поиска для общей библиотеки в исполняемый файл. – caf

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