Создание библиотек на C / C ++ - я не могу найти мою библиотеку - PullRequest
1 голос
/ 29 мая 2009

Я пытаюсь узнать, как создать библиотеку C / C ++ в среде Linux, но у меня возникла проблема (возможно, тривиальная), которую онлайн-учебники не помогли решить.

Для определенности предположим, что у меня есть файл foo.c со следующим кодом:

//file: foo.c
#include <stdio.h>
void hello(void)
{
  printf("hello!\n");
}

foo.h:

//file: foo.h
void hello(void);

и программа, которая использует функцию hello () из foo.c с именем prog.c:

//file: prog.c

#include "foo.h"

int main(void)
{
  hello();
  return 0;
}

Все три файла находятся в одном каталоге. Затем я скомпилировал foo.c с:

gcc -fPIC -c foo.c

и получил файл foo.o. Затем я использовал ld для создания файла библиотеки:

ld -G foo.o -o libfoo.so

Но когда я пытаюсь скомпилировать prog.c с:

gcc -o prog prog.c -lfoo

Я получил сообщение об ошибке:

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

Я убежден, что это какая-то тривиальная проблема пути, но я не смог найти решение. Так что мой вопрос на самом деле, если эта процедура не так, или я должен поместить файл libfoo.so в специальный путь.

Другой вопрос, как это меняется, если я использую g ++ вместо gcc.

Спасибо.

EDIT:

Я знаю, что могу скомпилировать как prog.c, так и foo.c в prog.o и foo.o, а затем связать их для создания исполняемого файла. Но в моей исходной задаче я хочу скомпилировать foo.c таким образом, чтобы я мог распространять его среди людей, которые будут использовать мои функции в своих собственных программах.

Ответы [ 2 ]

6 голосов
/ 29 мая 2009

ld не выполняет поиск в текущем каталоге по умолчанию. Если вы хотите, чтобы это делалось, вам нужно использовать параметр командной строки -L, поэтому, если ваша библиотека находится в текущем каталоге, вам нужно добавить -L. к последнему вызову gcc. Если библиотека динамически связана, вам также необходимо добавить текущий каталог в переменную окружения LD_LIBRARY_PATH (я предполагаю, что вы используете Linux).

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

3 голосов
/ 29 мая 2009

Попробуйте

gcc -o prog prog.c -lfoo -L.

Ключ -L добавляет свой аргумент к набору путей, по которым ld ищет файлы библиотеки. Синтаксис идентичен для g ++.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...