LINUX.ORG.RU

extern struct снова ни к селу ни к городу?

 ,


0

1

В очередной раз я не могу приготовить extern На сей раз проблема в следующем:

foo.c


extern struct A_struct A; 
...
... func(...)
{
    ...
    A.somth = smth;//неопределённая ссылка на "A"
    ...
}

foo.h

...
struct A_struct {
    ...
    int8_t somth;
    ...
};
...

На всё это выплёвывается ошибка про неопределённую ссылку на структуру.

Как фиксить, при том что в другом пректе кусок кода работает.


Я кретин, не дочитал код, alysnix спасибо, первый точно указал проблему.



Последнее исправление: nikitalol (всего исправлений: 4)

если при линковке ошибка, значит A нигде не определена, то есть под нее не распределена память. В данном случае есть extern обьявление, что она мол где-то есть. но ни одного обьектника, где она есть - нет.

ps. и не надо давать вольный перевод ошибки, давай оригинальный текст ошибки от компилятора или линкера

alysnix ★★★
()
Последнее исправление: alysnix (всего исправлений: 1)
Ответ на: комментарий от her_s_gory

в его коде extern нужен. он говорит, что где-то в другой единице компиляции есть переменная с именем A и типом A_struct. и если виден тип A_struct, то присваивание в поле .someth этой переменной будет легально.

а вот если такой переменная нигде не об’явлена без extern, то будет ошибка линковки. что видимо и есть в данном случае.

alysnix ★★★
()
Ответ на: комментарий от her_s_gory
  • линкера, и я его дал, но лови подробнее
/usr/bin/ld: foo.o: в функции «func»:
foo.c:N1: неопределённая ссылка на «A»
/usr/bin/ld:foo.c:N2: неопределённая ссылка на «A»
/usr/bin/ld: предупреждение: создаётся DT_TEXTREL в PIE
collect2: error: ld returned 1 exit status
make: *** [Makefile:30: Build/output] Ошибка 1
nikitalol
() автор топика
Ответ на: комментарий от nikitalol

у тебя нет файла, где написано

 A_struct A;

extern A_struct A - это просто обещание что при сборке будет файл с указанной декларацией. а у тебя ее нет. или нет файла с такой декларацией вообще, или есть, но она там static, или есть, но файл не внесен в список линкуемых.

alysnix ★★★
()
Последнее исправление: alysnix (всего исправлений: 1)

extern в c не пиши без необходимости, это плохой тон.
Должен быть один из случаев:
1. A публичная и доступна из других .c файлов (других compile unit'ов)
Тогда в foo.h должен быть «extern struct A_struct A;», а в foo.c «struct A_struct A», объявление структуры без static делает возможной её extern линковку
2. A доступна только из .c файла, при этом сама A_struct может пригодиться в других (например, через указатель или другая глобалка)
Тогда у тебя в foo.h должна быть только декларация A_struct, а в foo.c «static struct A_struct A;», static делает невозможной её extern линковку и она не будет конфликтовать с каким-нибудь int A в другом .c файле

mittorn ★★★★★
()