2015-04-27 2 views
3

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

Скажем, у меня есть два объектных файлов foo1.o и foo2.o сгенерированные

gcc foo1.c -I foo1.h -c -o foo1.o 
gcc foo2.c -I foo2.h -c -o foo2.o 

Gcc учебники говорит нам, мы можем генерировать libfoo.a используя

ar libfoo.a foo1.o foo2.o 

Это должно звучать глупо, но можно поставить те файлы заголовков внутри libfoo.a при архивировании? Таким образом, когда , связывающий с libfoo.a, людям больше не нужно тратить часы, чтобы найти и включаютfoo1.h и foo2.h, так что, кажется, есть некоторые преимущества при этом, не так ли?

Спасибо за ваши идеи.

+1

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

+0

@Paul Весь процесс мог быть автоматизирован, Пол, если бы люди gcc имели этот дизайн в умах. Вопрос в том, почему они этого не сделали. Должна быть причина, очень хорошая, что gcc ребята решили не экономить время для поиска заголовков, не так ли? – zell

+0

Вам не нужно искать заголовок, если вы правильно установите библиотеку. Вы просто '# include', и это работает. –

ответ

1

Во-первых, заголовок необходим для компиляции источника, а не для его связывания. Вам не нужен заголовок для связывания ваших объектов со статическими библиотеками.

Во-вторых, нет, нет стандартного или распространенного способа создания архива как с библиотекой, так и с ее заголовком. Вероятно, нет никакого способа сделать это с обычными компиляторами C.

Вы можете объявить прототипы библиотеки внутри вашего источника и игнорировать заголовок. Но это было бы небезопасно, так как не будет никакой гарантии, что и библиотека, и источник, скомпилированные с совместимыми прототипами.

Paul Griffiths комментарии. Если вы просто не хотите включать путь для каждой библиотеки, вы должны установить эти заголовки и те библиотеки и установить путь в своей среде.

Пример:

export C_INCLUDE_PATH=$HOME/install/include 
export LIBRARY_PATH=$HOME/install/lib 

Вы должны экспортировать каждый раз, когда вы открываете новую оболочку, или вы можете определить его в вас .bashrc

+0

Но нам нужно найти файлы заголовков и использовать «-I <Местоположение foo1.h><Местоположение foo2.h>", когда вы хотите установить ссылку на создание приложения, которое ссылается на foo.a, правильно? – zell

+0

Компиляция и связь - это разные вещи. Вам нужен заголовок, потому что вы используете оператор '# include' в исходном файле. Компилятор использует заголовок для обнаружения прототипов библиотек. Как только ваша компиляция будет завершена, вам нужно связать свои объекты с вашей библиотекой, теперь вы используете компоновщик, а не компилятор. Gcc выполняет обе работы для вас, но это все еще две разные вещи. –

1

Вы можете собрать все, что вы хотите в статическую библиотеку, но что вы не сможете вызывать функции извне (т. е. путем связывания), потому что, если вы этого хотите, вам всегда понадобятся их прототипы.

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