2012-08-03 6 views
1

У меня есть проект 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 

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

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

Неужели кто-нибудь знает решение?

С уважением Jan

+0

Вы можете показать вывод 'nm -s mylib.a' – askmish

ответ

0

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

+0

Здравствуйте, К сожалению, у меня нет источника библиотек, поскольку они были предоставлены нашим поставщиком только в двоичной форме.Нет проблем с компиляцией проекта, указав каждый объектный файл в правильном порядке, но я хочу собрать их в статическую библиотеку, потому что один файл легче поддерживать, чем двадцать файлов ... – Honza

+1

Попробуйте http://stackoverflow.com/ вопросы/2980102/comb-two-gcc-compiled-o-object-files-in-the-third-o-file и https://www.google.co.uk/search?q=gcc+combine+multiple+ lib + in + one –

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

+0

Привет, я почти уверен, что это проблема порядка ссылок, но это не решает проблему в моем случае. Проблема в том, что файлы obj, заархивированные в mylib.a, зависят от других файлов obj в одной и той же библиотеке. Я знаю, что проблемы с циклической зависимостью между несколькими библиотеками решают --start-group, но это не так, потому что библиотека только одна ... – Honza

+0

Попробуйте 'ranlib' архиватор вместо' ar'. – askmish

+0

Я уже пробовал это. Кроме того, параметр -s для ar должен делать то же самое, но больше не нужно :( – Honza

Смежные вопросы