#pragma once
does not stop a header file being included multiple times.
It stops a header file being included multiple times when compiling a single file. You have (at least) three files so you are declaring the same variables 3 times.
Don't put variable definitions in a header file. Do this instead
// textures.h
extern GLuint dirt, water; // variable declarations
// textures.cpp
GLuint dirt, water; // variable definitions
You can have as many declarations of a variable as you want (provided they are all identical), so it's OK to put declarations in a header file, you must have exactly one variable definition, so you put that in a .cpp file.
The key to remember is that every .cpp file is compiled completely independently of every other .cpp file, this is called separate compilation. So your idea that #pragma once
would stop a header file from being included by one .cpp file just because it had been included in another .cpp file just doesn't work. You're not the first to misunderstand this.