Невозможно найти ссылку на математическую функцию библиотеки std внутри библиотеки - PullRequest
1 голос
/ 18 марта 2010

У меня есть несколько программ, которые используют общие библиотеки. Эти разделяемые библиотеки, в свою очередь, используют различные стандартные библиотеки C. т.е.

Программа A и Программа B используют Shared Library S. Общая библиотека S использует стандартную математическую форму C. Я хочу иметь возможность статически связывать Shared Library S со стандартной библиотекой, а затем статически связывать программы A и B с S, чтобы мне не приходилось перетаскивать файлы библиотеки, поскольку эти программы будут работать на встроенная система под управлением BusyBox 0.61. Однако, когда я пытаюсь статически связать программы с Shared Library S, я получаю сообщение об ошибке от GCC, в котором говорится:

../lib/libgainscalecalc.a(gainscalecalc.): In function 'float2gs':
[path to my C file].c:73: undefined reference to 'log'

Может кто-нибудь помочь мне? Команды make, которые я использую, приведены ниже:

CFLAGS += -Wall -g -W
INCFLAGS = -I$(CROSS_INCLUDE)/usr/include  
LIBFLAGS += -L$(CROSS_LIB)/usr/lib -lm

gainscalecalc_static.o: gainscalecalc.c
$(CC) $(CFLAGS) -c $< -I. $(INCFLAGS) -o $@

gainscalecalc_dynamic.o: gainscalecalc.c
$(CC) $(CFLAGS) -fPIC -c $< -o $@

all: staticlib dynamiclib static_driver dynamic_driver

clean:
$(RM) *.o *.a *.so *~ driver core $(OBJDIR)

static_driver: driver.c staticlib
$(CC) $(CFLAGS) -static driver.c $(INCFLAGS) $(LIBFLAGS) -I. -L. -lgainscalecalc -o $@

dynamic_driver: driver.c dynamiclib
$(CC) $(CFLAGS) driver.c -o $@ -L. -lgainscalecalc

staticlib: gainscalecalc_static.o
$(AR) $(ARFLAGS) libgainscalecalc.a gainscalecalc_static.o
$(RANLIB) libgainscalecalc.a
chmod 777 libgainscalecalc.a

dynamiclib: gainscalecalc_dynamic.o
$(CC) -shared -o libgainscalecalc.so gainscalecalc_dynamic.o
chmod 777 libgainscalecalc.so

Редактировать: Связывание с общими библиотеками прекрасно компилируется, я просто еще не проверял их

1 Ответ

2 голосов
/ 18 марта 2010

Поместите $ (LIBFLAGS) после lgainscalecalc. Командная строка компоновщика зависит от позиции. Размещение -lm после вашей библиотеки заставит компоновщик использовать libm.a для разрешения ссылок, которые использует ваша библиотека.

...