Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Ошибка компиляции нескольких файлов


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

[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

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

Автор: Void 5.11.2005, 22:30
powerfox
В snake.h:
Код
extern int xpos, ypos;

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

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

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

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



Автор: powerfox 6.11.2005, 13:33
Спасибо! Тогда надо ещё и поменять *bg, *image, *screen.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)