Немного контекста. Допустим, у меня есть исходные файлы, которые должны оказаться в статической библиотеке. Допустим, есть два файла 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
изменить в библиотеке?
Это только небольшой пример, но рассмотрим большой проект с большим количеством файлов, и некоторые из них имеют одинаковые имена. Если вы сейчас хотите создать одну библиотеку, вы можете также оказаться в такой ситуации.
В целом, это просто плохая организация того, как составляются библиотеки, как называются файлы, или есть что-то еще, чтобы это работало?