Связывание библиотеки C с нестандартным именем - PullRequest
7 голосов
/ 21 января 2010

Я использую gcc для компиляции программы, которую мне нужно связать с библиотекой C с нестандартным именем; он называется stuff.a вместо libstuff.a.

Я не могу изменить имя файла (проблемы с разрешениями).

Я не хочу включать полную библиотеку (то есть используя gcc program.c stuff.a -oprogram)

Я хочу скомпилировать как gcc program.c -L/path/to/library/ -lstuff -oprogram, но gcc не найдет библиотеку (поскольку она не называется libstuff.a).

Я работаю над коробкой Linux.

Как я могу получить (динамическое) связывание?

EDIT:

Спасибо всем, и мои извинения за плохо сформулированный вопрос.

У меня даже не было общего объекта (я думал, что могу динамически связываться с * .a файлом), поэтому многих из вас это смутило. Опять извинения за мое невежество.

Я закончил тем, что создал общий объект в локальном каталоге, добавил местоположение в переменную среды LD_LIBRARY_PATH и снова установил связь.

Работает как брелок (от 1,3 М до 5,8 КБ).

Еще раз спасибо.

Ответы [ 6 ]

8 голосов
/ 21 января 2010

Вы должны были взглянуть на руководство по gcc :

Единственная разница между использованием Опция -l и указание имени файла заключается в том, что -l окружает библиотеку 'lib' и '.a' и ищет несколько каталоги.

Нет ничего плохого в использовании stuff.a в качестве аргумента.

7 голосов
/ 21 января 2010

Предполагая, что версия статического библиотеки общего объекта не существует, может потребоваться ее создание. Помните, что статическая библиотека stuff.a - это просто архив архива.

ar -x stuff.a
gcc -shared *.o -o libstuff.so

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

4 голосов
/ 21 января 2010

Можете ли вы создать символическую ссылку на stuff.a с именем libstuff.a? Вы даже можете сделать символическую ссылку в другом каталоге (то есть не в стандартном каталоге библиотеки) и использовать параметр -L с gcc, чтобы включить каталог в символическую ссылку.

3 голосов
/ 21 января 2010

свяжите его так же, как объектный файл:

gcc blah.o /usr/local/lib/foo.a -o binary

если вам не нравится полный путь, просто используйте переменную. в противном случае вы можете проанализировать LD_Library_Path и проверить файл на существование

1 голос
/ 23 июня 2017

Я знаю, что проблема заключалась в попытке установить статическую библиотеку как динамически связанную, но я хотел добавить это для потомков:

Если вы введете аргумент к параметру -l с двоеточием, :, он будет воспринимать имя как литерал, а не как имя, для которого необходимо добавить "lib" в начале и расширение файла в конце ,

В случае, если вы опишите, где вы хотите связать с static.a, а не с libstatic.a, и при условии, что вы намерены ссылаться на него статически, будет работать следующее:

 gcc program.c -L/path/to/library/ -l:stuff.a -oprogram

Конечно, вы могли бы поступить так, как упоминали Ричард Пенингтон и Anycorn, и просто включить вместо этого полностью исправленную библиотеку в командную строку:

gcc program.c /path/to/library/stuff.a -oprogram
1 голос
/ 21 января 2010

Просто дайте полное имя:

gcc program.c /path/to/library/stuff.a -oprogram
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...