Порядок линковки объектников
От: Hard_Club  
Дата: 16.08.10 07:52
Оценка:
В 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

Как действовать в данной ситуации?
Re: Порядок линковки объектников
От: Bell Россия  
Дата: 16.08.10 08:09
Оценка:
Здравствуйте, 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...
Ну или попробуй сделать минимальный пример, на котором ошибка повторяется, и запости его сюда целиком.
Любите книгу — источник знаний (с) М.Горький
Re: Порядок линковки объектников
От: Chorkov Россия  
Дата: 16.08.10 08:20
Оценка: 1 (1)
Здравствуйте, 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 глючит при линковке).

3) Посмотреть какие символы реально определены
dumpbin /SYMBOLS declare_external_panes_type.obj | find "panes_type"

Вомзможно, забыт extern "C", или имя попало в namespace, или оно static.
Re[2]: Порядок линковки объектников
От: Hard_Club  
Дата: 16.08.10 09:11
Оценка:
Спасибо за совет, было как раз это:

C>2) Проверить что такой файл (*.cpp) в проекте один (если есть два одноименный файла в разных папках, VC глючит при линковке).
Re: Порядок линковки объектников
От: MasterZiv СССР  
Дата: 17.08.10 21:09
Оценка:
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"
вообще лишены смысла какого-то в С/С++, так что либо удовлетворись
моим ответом выше, либо объясни толком, что слова значат.
Posted via RSDN NNTP Server 2.1 beta
Re[2]: Порядок линковки объектников
От: Кодт Россия  
Дата: 17.08.10 21:36
Оценка:
Здравствуйте, 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.cpp
int a = 1;

// src/b/impl.cpp // упомянутый конфликт имён файлов (багофича VC или его библиотекаря или линкера)
int b = 1;

// src/c/impl.cpp
int c = 1;
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.