Неопределенная ссылка при линковке статических библиотек

У меня есть пара библиотек, созданных с помощью avr-ar. Каждый содержит несколько объектов.

Объектам в библиотеке1 нужны символы из объектов в библиотеке2. Проблема в том, что когда я пытаюсь скомпилировать все это, я получаю undefined reference проблемы.

Вот где он терпит неудачу, в $(INCLUDE) $(CFLAGS) $(LIBS) не происходит ничего особенного.

CFLAGS=-mmcu=atmega328p -DF_CPU=16000000UL -Os -w -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums
LIBS=library1.a library2.a

$(CXX) $(INCLUDE) $^ $(CFLAGS) -o $@ $(LIBS)

Я использую Ubuntu 12.04 и

Using built-in specs.
COLLECT_GCC=avr-g++
COLLECT_LTO_WRAPPER=/usr/lib/gcc/avr/4.5.3/lto-wrapper
Target: avr
Configured with: ../src/configure -v --enable-languages=c,c++ --prefix=/usr/lib --infodir=/usr/share/info --mandir=/usr/share/man --bindir=/usr/bin --libexecdir=/usr/lib --libdir=/usr/lib --enable-shared --with-system-zlib --enable-long-long --enable-nls --without-included-gettext --disable-libssp --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=avr
Thread model: single
gcc version 4.5.3 (GCC) 

Если я извлекаю объекты из библиотек и помещаю все в библиотеку, все идет хорошо.

Я хотел бы сохранить их отдельно, есть ли способ добиться этого?


person johndoe    schedule 14.08.2012    source источник
comment
Было бы полезно, если бы вы могли отредактировать свой вопрос, включив в него фактические ошибки, а также содержимое указанных переменных makefile.   -  person Some programmer dude    schedule 14.08.2012
comment
Кроме того, вы пытались изменить порядок двух библиотек?   -  person Some programmer dude    schedule 14.08.2012
comment
@JoachimPileborg Да, я пытался изменить порядок библиотек, но получаю больше ошибок с неопределенными символами. С заказом я получаю только один.   -  person johndoe    schedule 14.08.2012
comment
И ошибка связана с неопределенной ссылкой, которая должна быть в одной из ваших библиотек? Или речь о какой-то другой функции?   -  person Some programmer dude    schedule 14.08.2012
comment
Да, ошибка в одной из библиотек. Как я уже сказал, то, чего не хватает, находится в одной из других библиотек. Итак, мне нужно, чтобы компоновщик просмотрел все библиотеки, прежде чем выдавать ошибку неопределенной ссылки.   -  person johndoe    schedule 14.08.2012
comment
Пожалуйста, добавьте полную командную строку компилятора, а также полный текст полученной ошибки.   -  person user1202136    schedule 14.08.2012
comment
Это циклическая зависимость. Мне удалось решить это с помощью LIBS=library1.a library2.a library1.a Tough, я все еще жду более чистого решения, какого-то флага компилятора.   -  person johndoe    schedule 14.08.2012


Ответы (2)


вы можете попробовать заставить компоновщик сделать рекурсивную ссылку, сгруппировав библиотеки. Я не проверял следующее, но, возможно, изменил:

LIBS=library1.a library2.a

To

LIBS=-Wl,--start-group library1.a library2.a -Wl,--end-group

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

Надеюсь это поможет

person William Culver    schedule 15.08.2012
comment
Спасибо, это то, что я искал. - person johndoe; 16.08.2012

Поскольку вы говорите, что библиотека1 зависит от ссылок из библиотеки2, ваш LIBS=library1.a library2.a необходимо изменить на LIBS=library2.a library1.a

Во время компиляции символы анализируются слева направо в порядке перечисления ваших библиотек, поэтому, если вы полагаетесь на библиотеку2.а в библиотеке1.а, вам нужно сначала предоставить библиотеку2.а.

person Amarnath Revanna    schedule 14.08.2012
comment
Между некоторыми библиотеками есть циклическая зависимость, мне удалось решить ее, используя что-то вроде этого LIBS=library1.a library2.a library1.a - person johndoe; 14.08.2012