В Visual C проекте возникла проблема с тем, что в разных С-файлах определены глобальные переменные, затем в одном из файлов собираются ссылки на эти переменные как extern.
Но собираются не все, а на некоторые выдается ошибка:
1>elm.obj : error LNK2001: unresolved external symbol _external_panes_type 1>elm.obj : error LNK2001: unresolved external symbol _external_notify_type
Здравствуйте, Hard_Club, Вы писали:
H_C>В Visual C проекте возникла проблема с тем, что в разных С-файлах определены глобальные переменные, затем в одном из файлов собираются ссылки на эти переменные как extern.
H_C>Но собираются не все, а на некоторые выдается ошибка:
1>>elm.obj : error LNK2001: unresolved external symbol _external_panes_type 1>>elm.obj : error LNK2001: unresolved external symbol _external_notify_type
H_C>Как действовать в данной ситуации?
Порядок линковки объектников совершенно не важен. Ищи ошибки — может быть имя переменной указано неверно, может быть c-файл не включен в проект, может быть глобальная переменная объявлена как static...
Ну или попробуй сделать минимальный пример, на котором ошибка повторяется, и запости его сюда целиком.
Здравствуйте, Hard_Club, Вы писали:
H_C>В Visual C проекте возникла проблема с тем, что в разных С-файлах определены глобальные переменные, затем в одном из файлов собираются ссылки на эти переменные как extern.
H_C>Но собираются не все, а на некоторые выдается ошибка:
1>>elm.obj : error LNK2001: unresolved external symbol _external_panes_type 1>>elm.obj : error LNK2001: unresolved external symbol _external_notify_type
H_C>Как действовать в данной ситуации?
1) Проверить что обьектник, в котором должен был быть определн символ, вклюбчен в список для линковки.
2) Проверить что такой файл (*.cpp) в проекте один (если есть два одноименный файла в разных папках, VC глючит при линковке).
Спасибо за совет, было как раз это:
C>2) Проверить что такой файл (*.cpp) в проекте один (если есть два одноименный файла в разных папках, VC глючит при линковке).
Hard_Club wrote:
> В Visual C проекте возникла проблема с тем, что в разных С-файлах > определены глобальные переменные, затем в одном из файлов собираются > ссылки на эти переменные как extern. > > Но собираются не все, а на некоторые выдается ошибка: > > 1>elm.obj : error LNK2001: unresolved external symbol _external_panes_type > 1>elm.obj : error LNK2001: unresolved external symbol _external_notify_type > > Как действовать в данной ситуации?
Порядок линковки объектников в любом случае не определён и роли не играет
никакой.
Если одна и та же переменная определена несколько раз, то это нарушение one
definition rule, его по-любому надо убирать. Соответственно, определяя
переменную только один раз. Если линкер наоборот выдаёт
unresolved external symbol _external_panes_type, это значит,
что переменная _external_panes_type была объявлена, но не была определена.
Соответственно, решение -- таки её определить в одном и только в одном
модуле.
Слова "в одном из файлов собираются ссылки на эти переменные как extern"
вообще лишены смысла какого-то в С/С++, так что либо удовлетворись
моим ответом выше, либо объясни толком, что слова значат.
Здравствуйте, MasterZiv, Вы писали:
MZ>Слова "в одном из файлов собираются ссылки на эти переменные как extern" MZ>вообще лишены смысла какого-то в С/С++, так что либо удовлетворись MZ>моим ответом выше, либо объясни толком, что слова значат.
Экий ты недогадливый! Учись телепать!
///////////////////////////////////////////////////////////////
// inc/all.h - "в одном из файлов собираются ссылки как extern"extern int a;
extern int b;
extern int c;
// src/elem.cpp#include"all.h"// - возможно, не в хедере, а прямо в сырце
////////////////////////////////////////////////////////
// "в разных файлах определены глобальные переменные..."
// src/a/impl.cppint a = 1;
// src/b/impl.cpp // упомянутый конфликт имён файлов (багофича VC или его библиотекаря или линкера)int b = 1;
// src/c/impl.cppint c = 1;