c++include

include directive messing up with the program


I got a situation, I can't get a program compile since I splitted the files cause i thought it was too big. Once the files is all merged in one, it works perfectly. Now that i splitted them, the compiler gives me the following error:

||=== Snake_Game, Debug ===|
D:\Projects\Snake_Game\Graph_Funcs.c||In function 'snake_crashed':|
D:\Projects\Snake_Game\Graph_Funcs.c|24|warning: 'textprintf_centre' is deprecated (declared at c:\program files (x86)\codeblocks\mingw\bin\../lib/gcc/mingw32/4.4.1/../../../../include/allegro/alcompat.h:178)|
D:\Projects\Snake_Game\Graph_Funcs.c||In function 'read_string':|
D:\Projects\Snake_Game\Graph_Funcs.c|91|warning: 'textout' is deprecated (declared at c:\program files (x86)\codeblocks\mingw\bin\../lib/gcc/mingw32/4.4.1/../../../../include/allegro/alcompat.h:157)|
D:\Projects\Snake_Game\Highscore.c||In function 'set_hscore':|
D:\Projects\Snake_Game\Highscore.c|30|warning: implicit declaration of function 'sort_scores'|
D:\Projects\Snake_Game\Menus.c||In function 'option_menu':|
D:\Projects\Snake_Game\Menus.c|114|warning: 'textprintf_centre' is deprecated (declared at c:\program files (x86)\codeblocks\mingw\bin\../lib/gcc/mingw32/4.4.1/../../../../include/allegro/alcompat.h:178)|
D:\Projects\Snake_Game\Menus.c|115|warning: 'textprintf_centre' is deprecated (declared at c:\program files (x86)\codeblocks\mingw\bin\../lib/gcc/mingw32/4.4.1/../../../../include/allegro/alcompat.h:178)|
D:\Projects\Snake_Game\Menus.c|116|warning: 'textprintf_centre' is deprecated (declared at c:\program files (x86)\codeblocks\mingw\bin\../lib/gcc/mingw32/4.4.1/../../../../include/allegro/alcompat.h:178)|
D:\Projects\Snake_Game\Menus.c|117|warning: 'textprintf_centre' is deprecated (declared at c:\program files (x86)\codeblocks\mingw\bin\../lib/gcc/mingw32/4.4.1/../../../../include/allegro/alcompat.h:178)|
D:\Projects\Snake_Game\Menus.c|118|warning: 'textprintf_centre' is deprecated (declared at c:\program files (x86)\codeblocks\mingw\bin\../lib/gcc/mingw32/4.4.1/../../../../include/allegro/alcompat.h:178)|
D:\Projects\Snake_Game\GamePlay.c||In function 'game_play':|
D:\Projects\Snake_Game\GamePlay.c|59|warning: 'textprintf_centre' is deprecated (declared at c:\program files (x86)\codeblocks\mingw\bin\../lib/gcc/mingw32/4.4.1/../../../../include/allegro/alcompat.h:178)|
obj\Debug\Highscore.o||In function `check_hscore':|
D:\Projects\Snake_Game\Highscore.c|13|multiple definition of `img_datafile'|
obj\Debug\Graph_Funcs.o:c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\allegro\alcompat.h|32|first defined here|
obj\Debug\Highscore.o||In function `check_hscore':|
D:\Projects\Snake_Game\Highscore.c|14|multiple definition of `snd_datafile'|
obj\Debug\Graph_Funcs.o:c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\allegro\alcompat.h|32|first defined here|
obj\Debug\Highscore.o||In function `check_hscore':|
D:\Projects\Snake_Game\Highscore.c|14|multiple definition of `fnt_datafile'|
obj\Debug\Graph_Funcs.o:c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\allegro\alcompat.h|33|first defined here|
obj\Debug\Init_Stuff.o||In function `init_allegro':|
D:\Projects\Snake_Game\Init_Stuff.c|14|multiple definition of `img_datafile'|
obj\Debug\Graph_Funcs.o:c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\allegro\alcompat.h|32|first defined here|
obj\Debug\Init_Stuff.o||In function `init_allegro':|
D:\Projects\Snake_Game\Init_Stuff.c|14|multiple definition of `snd_datafile'|
obj\Debug\Graph_Funcs.o:c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\allegro\alcompat.h|32|first defined here|
obj\Debug\Init_Stuff.o||In function `init_allegro':|
D:\Projects\Snake_Game\Init_Stuff.c|15|multiple definition of `fnt_datafile'|
obj\Debug\Graph_Funcs.o:c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\allegro\alcompat.h|33|first defined here|
obj\Debug\Menus.o||In function `main_menu':|
D:\Projects\Snake_Game\Menus.c|13|multiple definition of `img_datafile'|
obj\Debug\Graph_Funcs.o:c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\allegro\alcompat.h|32|first defined here|
obj\Debug\Menus.o||In function `main_menu':|
D:\Projects\Snake_Game\Menus.c|13|multiple definition of `snd_datafile'|
obj\Debug\Graph_Funcs.o:c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\allegro\alcompat.h|32|first defined here|
obj\Debug\Menus.o||In function `main_menu':|
D:\Projects\Snake_Game\Menus.c|14|multiple definition of `fnt_datafile'|
obj\Debug\Graph_Funcs.o:c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\allegro\alcompat.h|33|first defined here|
obj\Debug\main.o||In function `mangled_main':|
D:\Projects\Snake_Game\main.c|12|multiple definition of `img_datafile'|
obj\Debug\Graph_Funcs.o:c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\allegro\alcompat.h|32|first defined here|
obj\Debug\main.o||In function `mangled_main':|
D:\Projects\Snake_Game\main.c|12|multiple definition of `snd_datafile'|
obj\Debug\Graph_Funcs.o:c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\allegro\alcompat.h|32|first defined here|
obj\Debug\main.o||In function `mangled_main':|
D:\Projects\Snake_Game\main.c|13|multiple definition of `fnt_datafile'|
obj\Debug\Graph_Funcs.o:c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\allegro\alcompat.h|33|first defined here|
obj\Debug\Algorithms.o||In function `qsort_helper_by_score':|
D:\Projects\Snake_Game\Algorithms.c|13|multiple definition of `img_datafile'|
obj\Debug\Graph_Funcs.o:c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\allegro\alcompat.h|32|first defined here|
obj\Debug\Algorithms.o||In function `qsort_helper_by_score':|
D:\Projects\Snake_Game\Algorithms.c|14|multiple definition of `snd_datafile'|
obj\Debug\Graph_Funcs.o:c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\allegro\alcompat.h|32|first defined here|
obj\Debug\Algorithms.o||In function `qsort_helper_by_score':|
D:\Projects\Snake_Game\Algorithms.c|14|multiple definition of `fnt_datafile'|
obj\Debug\Graph_Funcs.o:c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\allegro\alcompat.h|33|first defined here|
obj\Debug\GamePlay.o||In function `game_play':|
D:\Projects\Snake_Game\GamePlay.c|13|multiple definition of `img_datafile'|
obj\Debug\Graph_Funcs.o:c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\allegro\alcompat.h|32|first defined here|
obj\Debug\GamePlay.o||In function `game_play':|
D:\Projects\Snake_Game\GamePlay.c|13|multiple definition of `snd_datafile'|
obj\Debug\Graph_Funcs.o:c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\allegro\alcompat.h|32|first defined here|
obj\Debug\GamePlay.o||In function `game_play':|
D:\Projects\Snake_Game\GamePlay.c|13|multiple definition of `fnt_datafile'|
obj\Debug\Graph_Funcs.o:c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\allegro\alcompat.h|33|first defined here|
ld.exe||cannot find -lalleg|
||=== Build finished: 37 errors, 9 warnings (0 minutes, 1 seconds) ===|

This is driving me crazy. I can't get these to work when I split them. And I find it a more organized thing, And I really wanna do it.

I'm dispose the files, so you guys can check out if you want.

Header main.h(the only header in the project. Although I had more than one for each .c file):

/**
Snake-Game:
A remake of the mobile game from nokia(don't know what model)
Made by Patrick Farias Bassut Souza <patrickbassut@hotmail.com

File: main.h
**/

#ifndef MAIN_H
#define MAIN_H

#include <stdio.h>
#include <stdlib.h>
#include <allegro.h>
#include <string.h>
#include <time.h>
#include "Images.h"
#include "Fonts.h"
#include "Sounds.h"

#define WINDOW_TITLE "Snake Game by Patrick Bassut"
#define VIDEO_CARD    GFX_AUTODETECT_WINDOWED
#define MAX_X       800
#define MAX_Y       600
#define V_MAX_X     0
#define V_MAX_Y     0
#define COLOR_BITS  32
#define DIGI_CARD   DIGI_AUTODETECT
#define MIDI_CARD   MIDI_AUTODETECT

#define WHITE makecol(255, 255, 255)
#define BLACK makecol(0, 0, 0)
#define PINK makecol(255, 0, 255)
#define RED makecol(255, 0, 0)
#define BLUE makecol(0, 0, 255)

#define NORTH 0
#define EAST 1
#define SOUTH 2
#define WEST 3

#define LEFT_BORDER 18
#define RIGHT_BORDER 766
#define TOP_BORDER -13
#define BOTTOM_BORDER 577

#define WALL_COLLISION 0
#define ITSELF_COLLISION 1
#define FOOD_COLLISION 2

#define INIT_SPEED 200

#define START_TAILS 2


typedef enum{false, true}bool;

typedef struct _POS{
    int x;
    int y;
}Pos;

typedef struct _config{
    int resolutionx;
    int resolutiony;
    bool window_mode;
    bool changed;
    bool music;
    bool sound;
    int volume;
}tConfig;

typedef struct _snake{
    Pos pos;
    int prev_snake_pos_x[400]; // Váriavel usada para 'guardar' os rastros X da snake.
    int prev_snake_pos_y[400]; // Váriavel usada para 'guardar' os rastros Y da snake.
    int tails_number;
    int direction;
    int speed;
}tSnake;

typedef struct _game{
    tConfig cur_cfg;
    Pos possible_food[24];
    Pos food;
    int food_type;
    int points;
    float speed_food_time;
    Pos spr;
    bool is_paused;
    bool is_playing;
}tGame;

typedef struct _Score
{
  int player_score;
  char player_name[11];
}Score;

tSnake player;
tGame game;
DATAFILE *imggg_datafile = NULL;
DATAFILE *snd_datafile = NULL;
DATAFILE *fnt_datafile = NULL;
Score score_table[11];

int qsort_helper_by_score(const void *e1, const void *e2);
bool check_collision(int collision_type);
BITMAP *new_food();
inline void close_game();
void game_play();
void snake_crashed(int points);
void game_introduction();
void read_string(char *str_to, int x, int y, int size);
void fadein(BITMAP *bmp_orig, int speed, int until);
void fadeout(int speed, int until);
inline bool check_hscore(int points);
bool load_scores();
bool save_scores();
void show_hscore_list(char *name);
void set_hscore();
bool init_allegro();
bool init_game();
bool init_settings();
int main_menu();
void option_menu();
void apply_settings(tConfig new_config);

#endif

Solution

  • It looks like the file include\allegro\alcompat.h is defining the same symbol (fnt_datafile, snd_datafile) multiple times, wherever you include it.

    If these are meant to be globals, they should be declared extern in the header and defined in a single implementation file.

    If they're methods, they should be declared inline.

    It works when there's just one file because that means just one translation unit exporting those symbols.