Порядок объектов в статической библиотеке

У меня есть проект C, использующий несколько объектных файлов, которые необходимо связать в определенном порядке, чтобы найти все необходимые символы.

Например, эта команда отлично работает (lib2.o зависит от lib1.o и т. Д.)

gcc -o my_app main.o lib1.o lib2.o lib3.o -lm

но

gcc -o my_app main.o lib3.o lib2.o lib1.o -lm

заканчивается неопределенной ссылкой на ошибку my_variable.

Это известное поведение, и его можно решить, например, добавив эти объекты в раздел GROUP в скрипте компоновщика.

Теперь я хотел бы поделиться этим объектом как статической библиотекой со своими коллегами. Так...

ar -rcs mylib.a lib1.o lib2.o lib3.o
gcc -o my_app main.o mylib.a -lm

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

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

Кто-нибудь знает решение?

С уважением Ян


person Honza    schedule 03.08.2012    source источник
comment
вы можете показать вывод nm -s mylib.a   -  person askmish    schedule 03.08.2012


Ответы (2)


Это может быть проблема с порядком ссылок. Когда компоновщик GNU видит библиотеку, он отбрасывает все символы, которые ему не нужны. Это также делается в последовательной форме слева направо.

Последние версии gcc / ld по умолчанию связываются с флагом --as-needed.

Это означает, что если вы напишете -lmylib.a перед файлом C, библиотека будет автоматически исключена (порядок имеет значение при тестировании, если что-то «нужно» вроде этого)

Вы можете исправить это одним из следующих способов:

  1. gcc -L. -o example example.c -lmylib.a
  2. gcc -L. -Wl,--no-as-needed -o example example.c -lmylib.a

Последний из них передает --no-as-needed компоновщику, что приведет к тому, что библиотека по-прежнему будет связана, даже если вы не вызывали какую-либо внешнюю функцию.

person askmish    schedule 03.08.2012
comment
Привет, я почти уверен, что это проблема с порядком ссылок, но в моем случае это не решает. Проблема в том, что файлы obj, заархивированные в mylib.a, зависят от других файлов obj в той же библиотеке. Я знаю, что проблемы с круговой зависимостью между несколькими библиотеками решают параметр --start-group, но это не так, поскольку библиотека только одна ... - person Honza; 03.08.2012
comment
Попробуйте ranlib архиватор вместо ar. - person askmish; 03.08.2012
comment
Я это уже пробовал. Также параметр -s для ar должен делать то же самое, но снова безуспешно :( - person Honza; 03.08.2012
comment
Спасибо, nm решил мою проблему. Я не заметил, что один из файлов, добавленных в библиотеку, уже был архивом .a, поэтому его объекты не были найдены компоновщиком. См. http://stackoverflow.com/questions/4318906/ar-on-an-existing-a-file - person Honza; 06.08.2012

Ваша ошибка означает, что проблема в одном из ваших файлов lib? .O [lib {позже} .o зависит от lib {ранее} .o]
Как вам удалось их скомпилировать?
Была ли компиляция предупреждения?
Прошло некоторое время с тех пор, как я использовал C, но я думаю, что вам нужно будет включить зависимые библиотеки в библиотеку, которая имеет зависимость - это может быть причиной того, что вы не можете найти слишком много ссылок на проблема, потому что ее на самом деле не существует.

person Germann Arlington    schedule 03.08.2012
comment
Здравствуйте, к сожалению, у меня нет исходного кода библиотек, так как они были предоставлены нашим поставщиком только в двоичной форме. Нет проблем скомпилировать проект, указав каждый объектный файл в правильном порядке, но я хочу собрать их в статическую библиотеку, потому что один файл легче поддерживать, чем двадцать файлов ... - person Honza; 03.08.2012
comment
Попробуйте stackoverflow.com/questions/2980102/ и google.co.uk/search?q=gcc+combine+multiple+lib+into+one - person Germann Arlington; 03.08.2012