Создание простой общей библиотеки - PullRequest
3 голосов
/ 14 ноября 2010

Я пытаюсь изучить общие библиотеки в 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

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

Ответы [ 3 ]

6 голосов
/ 14 ноября 2010

Попробуйте использовать опцию -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 
1 голос
/ 14 ноября 2010

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

На справочной странице GCC:

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

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

LD_LIBRARY_PATH=. ./client

Редактировать:

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

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

1 голос
/ 14 ноября 2010

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

...