У меня есть настольный ПК и ноутбук, на которых работают одинаковые Linux (Ubuntu 22.04.4 LTS), но на настольном компьютере загружено несколько дополнительных компонентов, которые, как мне показалось, не имеют значения, оба используют gcc-12 в качестве «основного» " одна и та же версия "ld" - 2.38.
Содержимое /etc/ld-conf.d в каждом случае одинаковое
< p>Контекст: в настоящее время я работаю над общей библиотекой C с двумя модулями «symbols.o» и «stringvec.o». Я прикрепил «основную» процедуру к концу «symbols.c», пока отлаживаю эти модули, поэтому в целях вопроса я задаю вопрос о программе.
В make-файле есть:
Код: Выделить всё
CFLAGS=-g -I incl
LDFLAGS=-lm
all: symbols
symbols: stringvec.o symbols.o
Код: Выделить всё
cc -g -I incl -c -o symbols.o symbols.c
cc -g -I incl -c -o stringvec.o stringvec.c
cc -lm symbols.o stringvec.o -o symbols
Код: Выделить всё
/usr/bin/ld: symbols.o: in function `getstringvalue':
/home/jmc/src/products/commonlib/symbols.c:176: undefined reference to `nearbyint'
/usr/bin/ld: symbols.o: in function `eval_tree':
/home/jmc/src/products/commonlib/symbols.c:433: undefined reference to `pow'
/usr/bin/ld: /home/jmc/src/products/commonlib/symbols.c:439: undefined reference to `fetestexcept'
/usr/bin/ld: /home/jmc/src/products/commonlib/symbols.c:441: undefined reference to `feclearexcept'
collect2: error: ld returned 1 exit status
make: *** [: symbols] Error 1
Код: Выделить всё
$(CC) -o symbols stringvec.o symbols.o $(LDFLAGS)
Код: Выделить всё
--as-needed
This only came up because I'd worked on it on the Desktop and thought I'd debugged it all and thought I'd just copy it to the laptop in case the urge to further fiddle with it over the next few days whilst I'm away was too strong.
I have tried
Код: Выделить всё
-Wl,--as-needed
Код: Выделить всё
LDFLAGS
I did notice slightly different output with
Код: Выделить всё
-t
Код: Выделить всё
LD
Источник: https://stackoverflow.com/questions/781 ... rder-rules