Ответ Карла правильный, но по неправильным причинам: на самом деле нет ничего плохого в соединении статических библиотек, как мы можем видеть, используя собственный пример Карла. Настройте образец кода Карла, а затем сделайте следующее: (я использую libtool, потому что это то, что использует XCode)
neutron:libtest jamie$ libtool -o a2.a a.a c.a
neutron:libtest jamie$ libtool -o b2.a b.a c.a
neutron:libtest jamie$ gcc main.o a2.a b2.a -o app2
neutron:libtest jamie$ ./app2
a
c
b
c
neutron:libtest jamie$
Связывает a2.a и b2.a с main.o. По словам Карла, это является источником проблем с OP, и app2 не должна ссылаться. Но, конечно, это так. Компоновщик достаточно умен, чтобы игнорировать два экземпляра одного и того же файла. Мы видим, что и a2.a, и b2.a содержат c.o:
neutron:libtest jamie$ ar -t a2.a
__.SYMDEF SORTED
a.o
c.o
neutron:libtest jamie$ ar -t b2.a
__.SYMDEF SORTED
b.o
c.o
Тем не менее, он прекрасно связывается.
Проблема, я полагаю, связана с Universal Binaries, либо с универсальными двоичными файлами PPC / x86, либо с универсальными двоичными файлами iPhone armv6 / armv7 iPhone. Проблема в том, что существует ошибка с категориями , а исправление (добавьте -all_load к флагам компоновщика) - это исправление, которое работает только для отдельных архитектур. Использование -all_load нарушает способность компоновщиков игнорировать символы, определенные для нескольких архитектур, и у вас возникает ошибка дублирования символов.
Я писал об этом здесь , включая лучшее решение, чем использование -all_load.