Немного контекста. Допустим, у меня есть исходные файлы, которые должны оказаться в статической библиотеке. Допустим, есть два файла cpp a.cpp
и a.cpp
, расположенных в двух разных подкаталогах. Примерно так:
foo/a.h
foo/a.cpp
bar/a.h
bar/a.cpp
Их содержание не конфликтует и совершенно другое. Имена файлов такие же.
Теперь при компиляции я получаю, конечно, два файла ao
.
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 / ao
и bar / ao
, помещая их в той же статической библиотеке. Теперь последний объектный файл перезапишет первый, поэтому при запуске nm libfoobar. a
Я просто вижу последний объект в библиотеке. Я предполагаю, что это происходит из-за того же имени объектного файла.
При создании статической библиотеки с ar
, всегда ли я должен комбинировать все объекты за один раз, или мне также хорошо запустить ar
несколько раз собирать часть объектов за раз, и все они попадают в одну статическую библиотеку? В этом примере я вижу, что первое работает, но не второе.
Как все будет работать, если один a.cpp
изменится, а статическая библиотека должна измениться? Найдет ли ar
нужный a.cpp
для изменения в библиотеке?
Это всего лишь небольшой пример, но рассмотрим большой проект с большим количеством файлов, некоторые из которых имеют такое же имя . Если вы сейчас хотите создать единую библиотеку, вы тоже можете столкнуться с этой ситуацией.
В общем, это просто плохая организация того, как составляются библиотеки, как файлы называются, или есть что-то еще, чтобы все работало?