Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка компиляции нескольких файлов, не пойму, что хочет компилятор. 
:(
    Опции темы
powerfox
Дата 5.11.2005, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

Репутация: 2
Всего: 97



Разбил программу на несколько исходных файлов с одним заголовочным файлом - не хочет компилироваться:
Код

[fox@localhost snake]$ g++ *.cpp snake.h `sdl-config --cflags --libs`
/home/fox/tmp/cch5qfyz.o(.bss+0x0): multiple definition of `back'
/home/fox/tmp/cc53elHh.o(.bss+0x0): first defined here
/home/fox/tmp/cch5qfyz.o(.bss+0x4): multiple definition of `image'
/home/fox/tmp/cc53elHh.o(.bss+0x4): first defined here
/home/fox/tmp/cch5qfyz.o(.bss+0x8): multiple definition of `screen'
/home/fox/tmp/cc53elHh.o(.bss+0x8): first defined here
/home/fox/tmp/cch5qfyz.o(.bss+0xc): multiple definition of `xpos'
/home/fox/tmp/cc53elHh.o(.bss+0xc): first defined here
/home/fox/tmp/cch5qfyz.o(.bss+0x10): multiple definition of `ypos'
/home/fox/tmp/cc53elHh.o(.bss+0x10): first defined here
/home/fox/tmp/ccHVDm12.o(.bss+0x0): multiple definition of `back'
/home/fox/tmp/cc53elHh.o(.bss+0x0): first defined here
/home/fox/tmp/ccHVDm12.o(.bss+0x4): multiple definition of `image'
/home/fox/tmp/cc53elHh.o(.bss+0x4): first defined here
/home/fox/tmp/ccHVDm12.o(.bss+0x8): multiple definition of `screen'
/home/fox/tmp/cc53elHh.o(.bss+0x8): first defined here
/home/fox/tmp/ccHVDm12.o(.bss+0xc): multiple definition of `xpos'
/home/fox/tmp/cc53elHh.o(.bss+0xc): first defined here
/home/fox/tmp/ccHVDm12.o(.bss+0x10): multiple definition of `ypos'
/home/fox/tmp/cc53elHh.o(.bss+0x10): first defined here
collect2: ld returned 1 exit status
[fox@localhost snake]$


snake.h:
Код

#ifndef SNAKE_HEADER
#define SNAKE_HEADER
#include <stdio.h>
#include <stdlib.h> 
#include <SDL/SDL.h>


SDL_Surface *back=SDL_LoadBMP("/docs/programming/Sdl/progs/less2/bg.bmp");
SDL_Surface *image=SDL_LoadBMP("/docs/programming/Sdl/progs/less2/image.bmp");
SDL_Surface *screen=SDL_SetVideoMode(640,480,24,SDL_HWSURFACE|SDL_DOUBLEBUF);

int xpos=0, ypos=0;



void DrawIMG(SDL_Surface *img, int x, int y);
void DrawIMG(SDL_Surface *img, int x, int y, int w, int h, int sx, int sy);
void DrawBG(void);
void DrawScene(void);

void initsystem();
void driver();


#endif //SNAKE_HEAER

Вся программы в прикреплённом архиве

Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  snake.tar.gz 30,39 Kb


--------------------
user posted image
PM WWW   Вверх
Void
Дата 5.11.2005, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



powerfox
В snake.h:
Код
extern int xpos, ypos;

В любом cpp-файле:
Код
int xpos = 0, ypos = 0;



--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
powerfox
Дата 6.11.2005, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

Репутация: 2
Всего: 97



Спасибо, Void!
А почему нельзя их сделать глобальными и определить в snake.h?
Кстати, а snake.h ведь не надо компилировать?


--------------------
user posted image
PM WWW   Вверх
srd
Дата 6.11.2005, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 27
Всего: 49



Цитата(powerfox @ 6.11.2005, 19:44)
А почему нельзя их сделать глобальными и определить в snake.h?

Они и так глобальные. Все объекты должны определяться только один раз. Грубо говоря, препроцессор просто вставляет вместо директивы #include текст соответствующего заголовочного файла, а с получившейся единицей трансляции работает уже компилятор, и компилятор с каждой единицей работает отдельно, не делая никаких предположений о других модулях, даже не подозревая об их существовании. Когда ты пишешь определение переменных в заголовочном файле (int xpos = 0, ypos = 0), то фактически компилятор определяет эти переменные в каждом модуле, включающем этот заголовочный файл. Это очень расстраивает компоновщик (как в твоём примере). extern int x - это не определние, а объявление переменной. С помощью такой инструкции ты информируешь компилятор, что у тебя где-то существует объект с таким-то именем и таким-то типом (ты его должен определить в любом cpp файле один раз). И компилятор генерирует правильный код для использования объекта, не зная его адреса (так наз. "заглушки"). Потом компоновщик находит объект и записывает правильный адрес.





--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
powerfox
Дата 6.11.2005, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

Репутация: 2
Всего: 97



Спасибо! Тогда надо ещё и поменять *bg, *image, *screen.


--------------------
user posted image
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0492 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.