Я использую gcc 4.3.4 и ld 2.20.51 в Cygwin под Windows 7. Вот упрощенная версия моей проблемы:
foo.o
содержит функцию foo_bar ()
, который вызывает bar ()
в bar.o bar.o
содержит функцию bar ()
main.c
вызывает функции в foo.o
, но foo_bar ()
отсутствует в цепочке вызовов Если я попытаюсь скомпилировать main.c и связать его с foo.o, я получу ссылку undefined to _foo_bar
ошибка от ld. Как вы можете видеть из моего Makefile, за исключением приведенного ниже, я пробовал использовать флаги для помещения каждой функции в отдельный раздел и чтобы компоновщик удалял неиспользуемые разделы.
COMPILE_CYGWIN = gcc -iquote$(INCDIR)
COMPILE = $(COMPILE_CYGWIN) -g -MMD -MP -Wall -ffunction-sections -Wl,-gc-sections $(DEFINE)
main_OBJECTS = main.o foo.o
main.exe : $(main_OBJECTS)
$(COMPILE) -o main.exe $(main_OBJECTS)
Функция foo_bar ()
- это короткая функция который обеспечивает соединение между двумя сетевыми уровнями в стеке протоколов. Некоторым программам это не нужно, поэтому они не будут ссылаться на другие объектные файлы, относящиеся к верхнему уровню стека. Это небольшая функция, и кажется неуместным помещать ее в отдельный файл .o.
Я не понимаю, почему ld выдает ошибку - ничего не вызывает foo_bar ()
, так что в этом нет необходимости включить bar ()
в окончательный исполняемый файл. Сотрудник только что сказал мне, что ld
не является «умным компоновщиком», так что, может быть, то, что я пытаюсь сделать, невозможно?