Статическая библиотека с объектными файлами с тем же именем (ar) - PullRequest
9 голосов
/ 05 февраля 2011

Немного контекста. Допустим, у меня есть исходные файлы, которые должны оказаться в статической библиотеке. Допустим, есть два файла cpp a.cpp и a.cpp, расположенные в двух разных подкаталогах. Примерно так:

foo/a.h
foo/a.cpp
bar/a.h
bar/a.cpp

Их содержание не конфликтует и совершенно другое. Имена файлов точно такие же.

Теперь, при компиляции, я получаю два a.o файла, конечно.

gcc -c foo/a.cpp -o foo/a.o
gcc -c bar/a.cpp -o bar/a.o

Если я сейчас создаю статическую библиотеку с

ar rcs libfoobar.a foo/a.o bar/a.o

Я вижу оба файла в статической библиотеке, работающей nm libfoobar.a. Кажется хорошо.

Задача

Проблема, которую я вижу, заключается в том, что я запускаю команду ar отдельно для foo/a.o и bar/a.o, помещая их в одну и ту же статическую библиотеку. Теперь последний объектный файл будет перезаписывать первый, поэтому при запуске nm libfoobar.a я просто вижу последний объект в библиотеке. Я предполагаю, что это так из-за того же имени объектного файла.

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

Как все будет работать, если один a.cpp изменится, а статическая библиотека должна измениться? Найдет ли ar право a.cpp изменить в библиотеке?

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

В целом, это просто плохая организация того, как составляются библиотеки, как называются файлы, или есть что-то еще, чтобы это работало?

Ответы [ 3 ]

3 голосов
/ 05 февраля 2011

Библиотека - это просто набор функций и / или данных, которые были сгруппированы по объектным файлам в библиотеке, и эти объектные файлы имеют имя. Эти имена не играют никакой роли, кроме как для обновления / извлечения / удаления его.

Поэтому вполне законно иметь два одинаковых имени для двух или более объектных файлов. При обновлении библиотеки библиотекарь заменяет первый объект тем именем, которое вы заменяете, и больше не смотрит.

Хотя это не очень разумно.

3 голосов
/ 05 февраля 2011

Вы должны думать о ar как об очень старом архиваторе файлов.Он даже ничего не знает об архивировании каталога.(архивные файлы плоские)

(man ar): ar - create, modify, and extract from archives

man ar, опция r:

r Вставить элемент файлов ..в архив (с заменой).Эта операция отличается от q тем, что все ранее существующие члены удаляются, если их имена совпадают с добавляемыми .

Попробуйте запустить ar t libfoobar.a, и вы увидите только a.o файлы, потому что ar не сохранил имя каталога в архиве.

Поэтому вы должны по-разному именовать все объектные файлы, помещенные в архив (UPD) , если вы хотите обновить некоторые объектные файлыбиблиотека с ar

ar rcs lib.a foo/a.o bar/a.o выполняет замену ao, найденного в lib.a, но не проверяет добавленные файлы на наличие конфликта имен.

Другой случай: ar rcs lib.a foo/a.o и ar rcs lib.a bar/a.o сохранит первый архив в архиве, затем второй ar найдет старый a.o в архиве и заменит старый файл.

1 голос
/ 05 февраля 2011

Я могу ответить только на часть вашего вопроса.Из синтаксиса Makefile мы видим, что это был обычный способ - обновлять только один объект.Но, например, подход automake заключается в перестройке библиотеки с нуля, даже если один файл был изменен.Сейчас это не представляет большой проблемы ...

Извините, сейчас у вас нет unix, поэтому мы все еще будем ждать ответа экспертаопыт, я бы не рекомендовал иметь два файла с одинаковым именем в статической библиотеке.

...