Неопределенная ссылка на глобальную переменную

Я работаю с C и движком Quake 3/ioquake. Обратите внимание, что это не конкретный вопрос игрового движка, это чисто запрос на языке C.

g_entities — это переменная, определенная глобально в движке. Для этой переменной также используется оператор extern.

Многочисленные другие .c файлы в движке вызывают эту переменную без проблем, однако, когда я делаю это из своего кода, я получаю ошибку компоновщика undefined reference to g_entities при компиляции.

Мой код:

// get entity information for this bot (e.g. health etc)
gentity_t *entity;
entity = &g_entities[1];

Ошибка при создании:

/home/george/Desktop/ioquake/ioquake-latest/ioquake3/code/botlib/be_ai_char.c:1196: undefined reference to `g_entities'

Я был бы признателен за любой совет, который мог бы дать любой гуру C, который мог бы указать мне на решение. Спасибо.


person George    schedule 22.04.2013    source источник
comment
Возможно, вам не хватает файла включения, в котором эта переменная фактически объявлена.   -  person Danny    schedule 22.04.2013
comment
@ Дэнни, это было мое первоначальное подозрение. Я включаю файл, в котором он объявлен, и получаю указанную выше ошибку. Когда я опускаю включение, я получаю другую ошибку - g_entities is undeclared   -  person George    schedule 22.04.2013
comment
Вы случайно не используете C++, а не C? Если да, это может быть причиной, и вам нужно объявить переменную extern "C".   -  person Nikos C.    schedule 22.04.2013
comment
@НикосС. простите меня, если я неосведомлен/ошибаюсь в этом, но я использую make, который, как мне кажется, использует gcc.   -  person George    schedule 22.04.2013


Ответы (2)


Это не проблема файла заголовка. Вам нужно связать объект, который содержит определение g_entities. Это может быть объектный файл или библиотека. Иногда порядок, в котором вы связываете вещи, также имеет значение.

Вы знаете, где определяется g_entities? Другой код ссылается на этот символ, как он его разрешает? С чем это связано?

person Ziffusion    schedule 22.04.2013
comment
Я рассмотрел это и изучил это. Он определен в g_main.c, который является основным файлом C для всего движка. Очевидно, что все остальные файлы кода включаются, начиная с этого файла. Единственное, о чем я могу думать, это порядок #includes, и я пробовал несколько, но безрезультатно. - person George; 22.04.2013
comment
Вставьте вывод nm -A g_main.o | grep -i g_entities. Также вставьте строку ссылки из вывода сборки (сделайте вывод). - person Ziffusion; 22.04.2013
comment
Спасибо за ваш вклад Ziffusion. См. следующее: pastie.org/private/ozggrbg5mjkktx93vo6aeg. - person George; 22.04.2013
comment
Можете ли вы вставить больше вывода сборки? Я не вижу линию связи. Может быть, просто вставьте весь вывод сборки. Также вставьте часть g_local.h, где объявляется ссылка на g_entities. - person Ziffusion; 22.04.2013
comment
Я нигде не вижу g_main.o. Можете ли вы убедиться, что он связан? Мне кажется, что некоторые детали вывода сборки скрыты. Проверьте, есть ли способ заставить его выводить подробный вывод. Вставьте это. Но сначала убедитесь, что g_main.o подключен. - person Ziffusion; 22.04.2013
comment
давайте продолжим это обсуждение в чате - person Ziffusion; 22.04.2013

Это потому, что модуль, который фактически определяет g_entities (без extern), отсутствует в наборе входных данных для компоновщика (и, скорее всего, во всех других модулях, которые на него ссылаются)?

person paquetp    schedule 22.04.2013
comment
На самом деле переменная определена в файле g_main.c, который, как мне кажется, является основной точкой входа для всего движка Quake 3. - person George; 22.04.2013