Почему LDFLAGS помещает мои библиотеки перед объектными файлами, генерирующими неопределенные ссылки?
Вот что происходит.
$ LDFLAGS=-ltestu01 make exemplo
cc -ltestu01 exemplo.c -o exemplo
/home/melba/tmp/ccO2KkjG.o: In function `main':
exemplo.c:(.text+0x6e): undefined reference to `unif01_CreateExternGenBits'
exemplo.c:(.text+0x7e): undefined reference to `bbattery_SmallCrush'
exemplo.c:(.text+0x8a): undefined reference to `unif01_DeleteExternGenBits'
collect2: error: ld returned 1 exit status
<builtin>: recipe for target 'exemplo' failed
make: *** [exemplo] Error 1
%
Я ожидал, что команда будет cc exemplo.c -o exemplo -ltestu01
, Как я могу убедиться, что подсказки для компоновщика идут в конец командной строки?
1 ответ
Решение
make -p
печатает рецепты по умолчанию.
Ваш рецепт должен быть:
%: %.c
# recipe to execute (built-in):
$(LINK.c) $^ $(LOADLIBES) $(LDLIBS) -o $@
Исходя из этого, должно быть очевидно, что вы должны устанавливать LDLIBS
не LDFLAGS
,
make exemplo LDLIBS=-ltestu01 -B
работает
cc examplo.c -ltestu01 -o exemplo
как и ожидалось. Похоже, что LDFLAGS
для таких вещей, как -Wl,--something
,