Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
xcode中的随机重复符号(C+;+;) 我试图在XCOD4.4.3../P>中构建一个C++项目_C++_Xcode4.6_Duplicate Symbol - Fatal编程技术网

xcode中的随机重复符号(C+;+;) 我试图在XCOD4.4.3../P>中构建一个C++项目

xcode中的随机重复符号(C+;+;) 我试图在XCOD4.4.3../P>中构建一个C++项目,c++,xcode4.6,duplicate-symbol,C++,Xcode4.6,Duplicate Symbol,在我的项目(一个非常简单的OpenGL游戏的开始)中,我有两个文件: 纹理。h: #pragma once #include <GLUT/GLUT.h> void load(); // load textures GLuint dirt, water; // variables to store texture handles #include "textures.h" #include "util.h" void textures::load() { dirt

在我的项目(一个非常简单的OpenGL游戏的开始)中,我有两个文件:

纹理。h:

#pragma once

#include <GLUT/GLUT.h>

void load(); // load textures

GLuint dirt, water; // variables to store texture handles
#include "textures.h"

#include "util.h"

void textures::load() {
    dirt = util::loadTexture("/Some/Path/Soil.png");
    water = util::loadTexture("/Some/Path/Water_fresh.png");
}
这里util.h定义了util::loadTexture函数

有两个文件包含textures.h。第一个(main.cpp)调用load()函数作为初始化的一部分,并访问污垢变量以绑定Soil.png纹理。第二个(Chunk.cpp)包括textures.h,但实际上还没有从中访问任何内容

当我尝试构建项目时,会出现以下错误:

重复符号\u污垢进入:
/Users/me/Library/Developer/Xcode/DerivedData/OpenGL_Testing-epporrdukappbwzawfhiwnlztzdns/Build/Intermediates/OpenGL Testing.Build/Debug/OpenGL Testing.Build/Objects normal/x86_64/main.o
/Users/me/Library/Developer/Xcode/DerivedData/OpenGL_Testing-epporrdukappbwzawfhiwnlztzdns/Build/Intermediates/OpenGL Testing.Build/Debug/OpenGL Testing.Build/Objects normal/x86_64/Chunk.o
重复符号\u水进入:
/Users/me/Library/Developer/Xcode/DerivedData/OpenGL_Testing-epporrdukappbwzawfhiwnlztzdns/Build/Intermediates/OpenGL Testing.Build/Debug/OpenGL Testing.Build/Objects normal/x86_64/main.o
/Users/me/Library/Developer/Xcode/DerivedData/OpenGL_Testing-epporrdukappbwzawfhiwnlztzdns/Build/Intermediates/OpenGL Testing.Build/Debug/OpenGL Testing.Build/Objects normal/x86_64/Chunk.o
重复符号_污垢进入:
/Users/me/Library/Developer/Xcode/DerivedData/OpenGL_Testing-epporrdukappbwzawfhiwnlztzdns/Build/Intermediates/OpenGL Testing.Build/Debug/OpenGL Testing.Build/Objects normal/x86_64/main.o
/Users/me/Library/Developer/Xcode/DerivedData/OpenGL_Testing-epporrdukappbwzawfhiwnlztzdns/Build/Intermediates/OpenGL Testing.Build/Debug/OpenGL Testing.Build/Objects normal/x86_64/textures.o
重复符号\u水进入:
/Users/me/Library/Developer/Xcode/DerivedData/OpenGL_Testing-epporrdukappbwzawfhiwnlztzdns/Build/Intermediates/OpenGL Testing.Build/Debug/OpenGL Testing.Build/Objects normal/x86_64/main.o
/Users/me/Library/Developer/Xcode/DerivedData/OpenGL_Testing-epporrdukappbwzawfhiwnlztzdns/Build/Intermediates/OpenGL Testing.Build/Debug/OpenGL Testing.Build/Objects normal/x86_64/textures.o
ld:体系结构x86_64的4个重复符号
叮当声:错误:链接器命令失败,退出代码为1(使用-v查看调用)
我理解这意味着某个地方有一个副本,或者一个标题包含多次。但我所有的标题都使用过一次pragma,我在工作区中搜索过“污垢”之类的东西,没有其他定义。我的其他标题工作得很好,即使是包含多次的标题。我已经用不同的关键词搜索了很多次这个问题,并查看了其他类似的问题,但我发现的都是

我以前在Xcode中遇到过其他“随机”错误——例如,一个项目一直试图使用我删除的动态库,并用静态库替换。即使我创建了一个全新的项目,错误依然存在。当从终端手动编译时,它可以工作

我遗漏了什么?

#pragma once
不会阻止头文件被多次包含

编译单个文件时,它会停止多次包含头文件。您有(至少)三个文件,因此您要声明相同的变量三次

不要将变量定义放在头文件中。改为这样做

// textures.h
extern GLuint dirt, water; // variable declarations


// textures.cpp
GLuint dirt, water; // variable definitions
一个变量可以有任意多个声明(前提是它们完全相同),所以可以将声明放在头文件中,必须只有一个变量定义,所以可以将其放在.cpp文件中


要记住的关键是,每个.cpp文件都是完全独立于其他每个.cpp文件编译的,这称为单独编译。因此,您认为只要一次
#pragma
就可以阻止一个.cpp文件包含一个头文件,因为它已经包含在另一个.cpp文件中,这是行不通的。你不是第一个误解这一点的人。

我已经尝试过用pragma替换Xcode最初创建的#ifndef#define#endif,但仍然不起作用……嗯#ifndef。。。它的工作原理与“pragma”一次完全相同,但由于同样的原因,它没有做到你认为它应该做的事情。我发布的不是提示,而是使用全局变量的正确方法。不要停止使用#pragma一次或#ifndef。。。它只是解决了一个不同于你想象的问题。那么我到底要做什么呢?而且,#pragma曾经为我的其他文件工作过,一个快速的谷歌搜索似乎表明#pragma曾经阻止了多次包含。虽然你知道的可能不止这些me@qxz不是这样的你不知道什么是翻译单位吗#pragma once和header fencpost防止在单个翻译单元中包含多个内容。它不会也不能防止由多个编译的翻译单元链接的重复定义,每个翻译单元都有自己的全局变量“副本”。这个答案是正确的。