error LNK2005:
От: _Cli_jmp  
Дата: 29.12.07 17:02
Оценка:
Помогите пожалуйста разобраться.Пишу в 2005ой студии.
К примеру — есть 2 .cpp файла(main.cpp и second.cpp),использующие один и тот же заголовок(пусть это будет header.h).В заголовке объявлена переменная LPDIRECT3D9 g_lpD3D;

При компиляции выдает ошибку линкера

1>second.obj : error LNK2005: "struct IDirect3D9 * g_lpD3D" (...) already defined in main.obj


содержание заголовка:
#pragma once
#ifndef _HEADER_H
#define _HEADER_H

LPDIRECT3D9 g_lpD3D;

#endif

я решил проблему добавив /FORCE в коммандную строку линкера,и он ошибку просто игнорирует(показывает ее как WARNING)...

Не подскажете другой способ исправления данной проблемы(без /FORCE)?
Re: error LNK2005:
От: remark Россия http://www.1024cores.net/
Дата: 29.12.07 17:56
Оценка:
Здравствуйте, _Cli_jmp, Вы писали:

_C_>Не подскажете другой способ исправления данной проблемы(без /FORCE)?



В .h файле оставь только объявление переменной:
extern LPDIRECT3D9 g_lpD3D;



А определение переменной вынеси в какой-нибудь .cpp файл:
LPDIRECT3D9 g_lpD3D;




1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re: error LNK2005:
От: Sashaka Россия  
Дата: 29.12.07 17:59
Оценка:
__C_>Не подскажете другой способ исправления данной проблемы(без /FORCE)?

описание структуры в H-ник, объявлениe в cpp, в других cpp использовать:
#include "mystruct.h"
extern mystruct g_mystruct;

а ваще глобальные переменные — нехорошо!
Re[2]: error LNK2005:
От: _Cli_jmp  
Дата: 29.12.07 18:07
Оценка:
Спасибо за помощь!

Здравствуйте, Sashaka, Вы писали:

__C_>>Не подскажете другой способ исправления данной проблемы(без /FORCE)?


S>описание структуры в H-ник, объявлениe в cpp, в других cpp использовать:

S>#include "mystruct.h"
S>extern mystruct g_mystruct;

S>а ваще глобальные переменные — нехорошо!


Что же такого нехорошего в глобальных переменных?
Re[3]: error LNK2005:
От: Sashaka Россия  
Дата: 29.12.07 19:08
Оценка:
S>>а ваще глобальные переменные — нехорошо!

_C_>Что же такого нехорошего в глобальных переменных?


а ты на с++ пишешь?

для меня например то, что у них нет владельца и то что они засирают namespace.

а вообще по этому поводу достаточно написано.
Re[4]: error LNK2005:
От: c-smile Канада http://terrainformatica.com
Дата: 29.12.07 19:16
Оценка:
Здравствуйте, Sashaka, Вы писали:

S>>>а ваще глобальные переменные — нехорошо!


_C_>>Что же такого нехорошего в глобальных переменных?


S>для меня например то, что у них нет владельца и то что они засирают namespace.


Дай определение термину "владелец" для данного случая.
А namespace тут при чем?

S>а вообще по этому поводу достаточно написано.


На заборах или где? Давай пальцем показывай.
Re[4]: error LNK2005:
От: _Cli_jmp  
Дата: 29.12.07 19:33
Оценка:
Здравствуйте, Sashaka, Вы писали:


S>а ты на с++ пишешь?


S>для меня например то, что у них нет владельца и то что они засирают namespace.


S>а вообще по этому поводу достаточно написано.



Да на С++...просто некоторые переменные решил сделать глобальными — мне кажется что так удобнее...странно,но по-моему в предыдущих версиях
VC++ можно было объявлять и определять переменные в header'ах...а может я не прав и что-то путаю
Re[5]: __declspec(selectany)
От: remark Россия http://www.1024cores.net/
Дата: 29.12.07 20:08
Оценка:
Здравствуйте, _Cli_jmp, Вы писали:

_C_>Здравствуйте, Sashaka, Вы писали:



S>>а ты на с++ пишешь?


S>>для меня например то, что у них нет владельца и то что они засирают namespace.


S>>а вообще по этому поводу достаточно написано.



_C_>Да на С++...просто некоторые переменные решил сделать глобальными — мне кажется что так удобнее...странно,но по-моему в предыдущих версиях

_C_>VC++ можно было объявлять и определять переменные в header'ах...а может я не прав и что-то путаю


Если этот хидер включается только в один cpp, то можно
Или можно пометить определение с помощью __declspec(selectany). Это будет примерно то же самое, как когда статическая переменная шаблонного класса определяется в h файле, но проблем не возникает — линкер просто выбирает первую попавшуюся копию, а остальные отбрасывает.



1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[6]: __declspec(selectany)
От: _Cli_jmp  
Дата: 29.12.07 20:19
Оценка:
Здравствуйте, remark, Вы писали:

R>Если этот хидер включается только в один cpp, то можно


да вот в том то и дело что не в один...

R>Или можно пометить определение с помощью __declspec(selectany). Это будет примерно то же самое, как когда статическая переменная шаблонного класса определяется в h файле, но проблем не возникает — линкер просто выбирает первую попавшуюся копию, а остальные отбрасывает.



надо попробовать...

Re[5]: error LNK2005:
От: Sashaka Россия  
Дата: 29.12.07 20:29
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Здравствуйте, Sashaka, Вы писали:


S>>>>а ваще глобальные переменные — нехорошо!


_C_>>>Что же такого нехорошего в глобальных переменных?


S>>для меня например то, что у них нет владельца и то что они засирают namespace.


CS>Дай определение термину "владелец" для данного случая.


В данном случае я не уверен, что человек пишет на С++, а не на С.

А так, я имею ввиду инкапсуляцию.

CS>А namespace тут при чем?


Ну, например, IDE студии показывает все глобальные переменные и функции в одном списке. Мне попадался проект где их там было около 100 штук, с именами типа "PrTGWW", часть из них использовалась в логике работы программы, из различных потоков, без всякой синхронизации. Такие переменные сложно отслеживать, где они инициализируются, кто к ним обращается, из каких потоков...

Самое интересное, что прога довольно нормально работала, пока не появились компы с p4 двуядерными или с hyperthreading...

S>>а вообще по этому поводу достаточно написано.


CS>На заборах или где? Давай пальцем показывай.


например, в этой книжке
Автор(ы): Герб Саттер, Андрей Александреску

Эта книга поможет новичку стать профессионалом, так как в ней
представлен сконцентрированный лучший опыт программистов на C++,
обобщенный двумя экспертами мирового класса. Начинающий программист
найдет в ней простые и понятные рекомендации для ежедневного
использования, подкрепленные примерами их конкретного применения
на практике.
, 10 глава.
Re[6]: error LNK2005:
От: c-smile Канада http://terrainformatica.com
Дата: 29.12.07 21:44
Оценка:
Здравствуйте, Sashaka, Вы писали:

S>>>>>а ваще глобальные переменные — нехорошо!

_C_>>>>Что же такого нехорошего в глобальных переменных?
S>>>для меня например то, что у них нет владельца и то что они засирают namespace.
CS>>Дай определение термину "владелец" для данного случая.
S>А так, я имею ввиду инкапсуляцию.

Я не понимаю как связаны "инкапсуляция" и "глобалная переменная".
Если тебе нужна глобальная переменная по смыслу то хоть обинкапсулируй все вокруг но избежать глобальной переменной тебе не удастся.

CS>>А namespace тут при чем?


S>Ну, например, IDE студии показывает все глобальные переменные и функции в одном списке. Мне попадался проект где их там было около 100 штук, с именами типа "PrTGWW", часть из них использовалась в логике работы программы, из различных потоков, без всякой синхронизации. Такие переменные сложно отслеживать, где они инициализируются, кто к ним обращается, из каких потоков...


S>Самое интересное, что прога довольно нормально работала, пока не появились компы с p4 двуядерными или с hyperthreading...


"Плохо работает на двухядерном потому что в IDE я вижу 100 штук PrTGWW".

Это не программирование. Это какая-то лирика и гадание на кофейной гуще.

S>>>а вообще по этому поводу достаточно написано.

CS>>На заборах или где? Давай пальцем показывай.
S>например, в этой книжке
Автор(ы): Герб Саттер, Андрей Александреску

Эта книга поможет новичку стать профессионалом, так как в ней
представлен сконцентрированный лучший опыт программистов на C++,
обобщенный двумя экспертами мирового класса. Начинающий программист
найдет в ней простые и понятные рекомендации для ежедневного
использования, подкрепленные примерами их конкретного применения
на практике.
, 10 глава.


И чего там так и написано: "а ваще глобальные переменные — нехорошо!"? Если да, то выкинь ту книжку.
Как и с любым другим разделямым ресурсом, работа с этими переменными имеет особенности — это да.
Re[7]: error LNK2005:
От: _Cli_jmp  
Дата: 29.12.07 22:02
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>И чего там так и написано: "а ваще глобальные переменные — нехорошо!"? Если да, то выкинь ту книжку.

CS>Как и с любым другим разделямым ресурсом, работа с этими переменными имеет особенности — это да.

так их что — в каждом .cpp файле объявлять ключевым словом extern или как?
я просто других способов кроме этого и объявления /FORCE(не знаю чревато это чем-то или нет) не знаю
Re[8]: error LNK2005:
От: remark Россия http://www.1024cores.net/
Дата: 29.12.07 22:23
Оценка:
Здравствуйте, _Cli_jmp, Вы писали:

_C_>Здравствуйте, c-smile, Вы писали:


CS>>И чего там так и написано: "а ваще глобальные переменные — нехорошо!"? Если да, то выкинь ту книжку.

CS>>Как и с любым другим разделямым ресурсом, работа с этими переменными имеет особенности — это да.

_C_>так их что — в каждом .cpp файле объявлять ключевым словом extern или как?



Да, нет. Просто в этом h-нике, где у тебя сейчас определение, объяви extern.


_C_>я просто других способов кроме этого и объявления /FORCE(не знаю чревато это чем-то или нет) не знаю


/FORCE и __declspec(selectany) работать-то должны, но попахивает это дурно. Лучше extern.



1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[7]: error LNK2005:
От: Sashaka Россия  
Дата: 29.12.07 22:32
Оценка:
CS>И чего там так и написано: "а ваще глобальные переменные — нехорошо!"? Если да, то выкинь ту книжку.
CS>Как и с любым другим разделямым ресурсом, работа с этими переменными имеет особенности — это да.

Спасибо за совет, так и поступлю. Удачи.
Re[9]: error LNK2005:
От: _Cli_jmp  
Дата: 29.12.07 22:34
Оценка:
Здравствуйте, remark, Вы писали:

R>/FORCE и __declspec(selectany) работать-то должны, но попахивает это дурно. Лучше extern.



R>


Итак,с __delspec(selectany) не работает.сделал отдельный .cpp файл,где определил переменные...в хедере объявил их со словом extern,все равно та же самая ошибка линкера....работает только с /FORCE...странно...
Re[10]: error LNK2005:
От: remark Россия http://www.1024cores.net/
Дата: 29.12.07 22:42
Оценка:
Здравствуйте, _Cli_jmp, Вы писали:

_C_>Здравствуйте, remark, Вы писали:


R>>/FORCE и __declspec(selectany) работать-то должны, но попахивает это дурно. Лучше extern.



R>>


_C_>Итак,с __delspec(selectany) не работает.сделал отдельный .cpp файл,где определил переменные...в хедере объявил их со словом extern,все равно та же самая ошибка линкера....работает только с /FORCE...странно...



Ты что-то напутал. Должно работать и с __delspec(selectany), и с extern.
Rebuild попробуй...



1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re: error LNK2005:
От: _Cli_jmp  
Дата: 29.12.07 23:13
Оценка:
Поковырялся и все-таки как Вы все и говорили все заработало...

Всем большущее спасибо!

С Наступающим!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.