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

У меня есть проект 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, даже если я думаю, что эта проблема должна быть относительно распространенной.

Пожалуйста, кто-нибудь знает решение?

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

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 с компоновщиком, что приведет к тому, что библиотека все еще будет связана, даже если вы не вызывали какую-либо функцию, внешнюю от нее.

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

Другие вопросы по тегам