Православный взгляд на ИТ

Гадость в VS .NET
StanB., православный из РПЦ - 21:35 26.11.2003
Вот такая проблема возникла. Решил я сделать .lib-файл для некоторых своих классов, чтобы не компилить каждый раз вместе с проектом, а просто подключить соответствующий .lib-файл. Я соорудил проект, куда включил два cpp-файла с классами. Проблема вышла в том, что оба эти класса используют один и тот же заголовочный файл содержащий некоторые структуры. И вот, компилер пишет:
Во-первых: Elevation_loader.obj : warning LNK4218: non-native module found; restarting link with /LTCG

Что это за ошибка? У меня в хелпе нет про неё.

Во-вторых, самое страшное:
Texture.obj : warning LNK4006: "struct TGA tga" (?tga@@3UTGA@@A) already defined in a previous module; second definition ignored
Texture.obj : warning LNK4006: "unsigned char * uTGAcompare" (?uTGAcompare@@3PAEA) already defined in a previous module; second definition ignored
Texture.obj : warning LNK4006: "unsigned char * cTGAcompare" (?cTGAcompare@@3PAEA) already defined in a previous module; second definition ignored
Texture.obj : warning LNK4006: "struct TGAHeader tgaheader" (?tgaheader@@3UTGAHeader@@A) already defined in a previous module; second definition ignored
3dobject.obj : warning LNK4006: "struct TGA tga" (?tga@@3UTGA@@A) already defined in a previous module; second definition ignored
3dobject.obj : warning LNK4006: "unsigned char * uTGAcompare" (?uTGAcompare@@3PAEA) already defined in a previous module; second definition ignored
3dobject.obj : warning LNK4006: "unsigned char * cTGAcompare" (?cTGAcompare@@3PAEA) already defined in a previous module; second definition ignored
3dobject.obj : warning LNK4006: "struct TGAHeader tgaheader" (?tgaheader@@3UTGAHeader@@A) already defined in a previous module; second definition ignored

Но это ещё пока только предупреждение, а вот когда я подключаю этот .lib к другому проекту и компилю ехе, начинаются ошибки:
Map_Editor error LNK2005: "struct TGA tga" (?tga@@3UTGA@@A) already defined in Main.obj
Map_Editor error LNK2005: "struct TGA tga" (?tga@@3UTGA@@A) already defined in Main.obj
Map_Editor error LNK2005: "struct TGAHeader tgaheader" (?tgaheader@@3UTGAHeader@@A) already defined in Main.obj
Map_Editor error LNK2005: "struct TGAHeader tgaheader" (?tgaheader@@3UTGAHeader@@A) already defined in Main.obj
Map_Editor error LNK2005: "unsigned char * cTGAcompare" (?cTGAcompare@@3PAEA) already defined in Main.obj
Map_Editor error LNK2005: "unsigned char * cTGAcompare" (?cTGAcompare@@3PAEA) already defined in Main.obj
Map_Editor error LNK2005: "unsigned char * uTGAcompare" (?uTGAcompare@@3PAEA) already defined in Main.obj
Map_Editor error LNK2005: "unsigned char * uTGAcompare" (?uTGAcompare@@3PAEA) already defined in Main.obj


Что же с этим всем делать? Если надо, пришлю исходники.

                


Уточнение
StanB., православный из РПЦ - 23:33 26.11.2003
Должен отметить, что указанныев ошибках типы, включенные по несколько раз, как раз содержатся в общем для двух классов заголовочном файле.

                


Re: Уточнение
Буквариус, Православный, РПЦ МП - 13:20 27.11.2003
Есть хорошая традиция для заголовочных файлов (если речь идет именно о С++): обертывать текст файла конструкцией препроцессора, исключающей ее повторное включение, если он уже определен. Скажем, если наш файл называется MyIncludeFile.hpp, его текст должен начинаться с:

#ifndef MYINCLUDEFILE_HPP_INCLUDED
#define MYINCLUDEFILE_HPP_INCLUDED

и заканчиваться

#endif

                


Re: Уточнение
StanB., православный из РПЦ - 20:29 27.11.2003
Я тоже про это думал, но нет, дело не в этом.

                


Re: Уточнение
J0ker, атеист - 22:19 16.12.2003
в этом, уважаемый, в этом... и переменные в хидерах не объявляют - вторая ошибка связана с этим - вы включили хидер в несколько С-файлов, потом их скомпилировали, и туда естественно попало по экземпляру объекта с одним и тем же именем, что линкеру соответственно совершенно не нравится.

                


Re: Уточнение
StanB., православный из РПЦ - 23:24 17.12.2003
J0ker, Вы писали:
> в этом, уважаемый, в этом... и переменные в хидерах не объявляют

Ну, а где же тогда их объявляют? А в windows.h разве не переменные объявлены?

                


Re: Уточнение
Буквариус, Православный, РПЦ МП - 13:00 23.12.2003
Нет, конечно. Покажите мне там хоть одну переменную.

В windows.h объявляются: подстановки препроцессора (#define-определения); типы (typedef, enum, struct); объявления функций; и иногда, возможно, extern-объявления переменных. Последнее означает, что переменная определена где-то в одном модуле, а остальных модулей просят не беспокоиться по поводу этого имени до этапа линкования.