Одни и те же версии Linux, CC, LD имеют разные правила порядка ссылок.Linux

Ответить
Гость
 Одни и те же версии Linux, CC, LD имеют разные правила порядка ссылок.

Сообщение Гость »


У меня есть настольный ПК и ноутбук, на которых работают одинаковые 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
On both machines "make" gives

Код: Выделить всё

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
On the desktop the final step returns to the command prompt with "symbols" built but on the laptop it moans about symbols from "-lm" missing.

Код: Выделить всё

/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
I can get round this easily by putting in the last part of the Makefile

Код: Выделить всё

$(CC) -o symbols stringvec.o symbols.o $(LDFLAGS)
But why the difference? Why is

Код: Выделить всё

--as-needed
turned on in one case but not the other? And why is the default make rule "wrong" as it were?
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
in but that doesn't seem to help.
I did notice slightly different output with option to .


Источник: https://stackoverflow.com/questions/781 ... rder-rules
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»