Порядок объектов в статической библиотеке
У меня есть проект 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-файлом библиотека будет автоматически исключена (порядок имеет значение при тестировании, если что-то "нужно", как это)
Вы можете исправить это с помощью:
gcc -L. -o example example.c -lmylib.a
gcc -L. -Wl,--no-as-needed -o example example.c -lmylib.a
Последний из которых проходит --no-as-needed
с компоновщиком, что приведет к тому, что библиотека все еще будет связана, даже если вы не вызывали какую-либо функцию, внешнюю от нее.
Ваша ошибка означает, что проблема в одном из ваших файлов lib?.O [lib{позже}.o зависит от lib {ранее}.o]
Как вам удалось их скомпилировать?
Были ли какие-нибудь предупреждения компиляции?
Прошло много времени с тех пор, как я использовал C, но я думаю, что вам нужно будет включить зависимые библиотеки в библиотеку, которая имеет зависимость - это может быть причиной того, что вы не можете найти слишком много ссылок на проблему, потому что это делает на самом деле не существует.