Связать библиотеку .a с объектом .o, поэтому при сборке нужно включать только .o - PullRequest
0 голосов
/ 08 сентября 2011

Я использую предварительно собранную библиотеку libdscud-6.02.a, которая включает в себя множество низкоуровневых вызовов ввода / вывода для некоторого конкретного оборудования.Исходя из этого, я создал несколько функций-оболочек, которые я скомпилировал в объектный файл с именем «io.o».

Теперь у меня есть несколько программ, которые я компилирую с этими функциями ввода-вывода и вместочтобы сделать это:

gcc libdscud-6.02a io.o -o test test.c

Я хотел бы просто иметь:

gcc io.o -o test test.c

Есть ли способ связать файл .a с файлом .o, поэтому мне нужно тольковключить файл .o при компиляции двоичных файлов?

Ответы [ 3 ]

3 голосов
/ 08 сентября 2011

Вы можете сделать наоборот и добавить файл io.o в файл .a, используя ar:

ar q libdscud-6.02.a io.o
1 голос
/ 08 сентября 2011

AFAIK Невозможно связать библиотеку .a и файл .o, чтобы создать другой промежуточный файл, т.е. файл, который не связан как файл .o. Решение, предоставленное Бертоном Самоградом, выглядит очень хорошим вариантом; но если вам не разрешено изменять файл библиотеки .a, вы можете следовать предложению, предоставленному DarkDust, если вы строите с использованием make.
Однако вы можете создать файл .so общей библиотеки из файла библиотеки .a и файла .o (я думаю, это то, что Майкл Барр пытается передать). Вы можете использовать только разделяемую библиотеку вместо обоих .a & .o файл для генерации вашего исполняемого файла следующим образом:
Создать общую библиотеку gcc io.o libdscud-6.02.a -shared -o io.so (обратите внимание, что порядок файлов, передаваемых для связывания, важен)
Создайте свой источник с gcc io.so -o test test.c. Для выполнения вашего исполняемого пути io.so должен находиться в пути поиска загрузчика (ld), т. Е. LD_LIBRARY_PATH.
Правильный способ работы с разделяемым объектом - создать libio.so, который является соглашением об именах и , а не io.so, и построить код как gcc test.c -o test -L<path_to_libio.so> -lio, а путь к libio.so должен выглядеть в ld путь для выполнения выходного исполняемого файла.
Я знаю, что создание разделяемой библиотеки только для того, чтобы избежать добавления другого файла для компиляции, кажется, не то, что вы хотите сделать ... но это просто для вашей информации на случай, если вы еще не знали:)

1 голос
/ 08 сентября 2011

Одним из решений было бы простое использование переменной make:

IO_STUFF = libdscud-6.02a io.o

...

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