gpt4 book ai didi

c++ - xcode (C++) 中的随机重复符号

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:29:56 25 4
gpt4 key购买 nike

我正在尝试在 Xcode 4.6.3 中构建一个 C++ 项目。

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

textures.h:

#pragma once

#include <GLUT/GLUT.h>

void load(); // load textures

GLuint dirt, water; // variables to store texture handles

textures.cpp:

#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() 函数作为初始化的一部分,并访问 dirt 变量以绑定(bind) Soil.png 纹理。第二个 (Chunk.cpp) 包含 textures.h,但实际上还没有从中访问任何内容。

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

duplicate symbol _dirt in:
/Users/me/Library/Developer/Xcode/DerivedData/OpenGL_Testing-epporrdukapbwzawfhiwnlztzdns/Build/Intermediates/OpenGL Testing.build/Debug/OpenGL Testing.build/Objects-normal/x86_64/main.o
/Users/me/Library/Developer/Xcode/DerivedData/OpenGL_Testing-epporrdukapbwzawfhiwnlztzdns/Build/Intermediates/OpenGL Testing.build/Debug/OpenGL Testing.build/Objects-normal/x86_64/Chunk.o
duplicate symbol _water in:
/Users/me/Library/Developer/Xcode/DerivedData/OpenGL_Testing-epporrdukapbwzawfhiwnlztzdns/Build/Intermediates/OpenGL Testing.build/Debug/OpenGL Testing.build/Objects-normal/x86_64/main.o
/Users/me/Library/Developer/Xcode/DerivedData/OpenGL_Testing-epporrdukapbwzawfhiwnlztzdns/Build/Intermediates/OpenGL Testing.build/Debug/OpenGL Testing.build/Objects-normal/x86_64/Chunk.o
duplicate symbol _dirt in:
/Users/me/Library/Developer/Xcode/DerivedData/OpenGL_Testing-epporrdukapbwzawfhiwnlztzdns/Build/Intermediates/OpenGL Testing.build/Debug/OpenGL Testing.build/Objects-normal/x86_64/main.o
/Users/me/Library/Developer/Xcode/DerivedData/OpenGL_Testing-epporrdukapbwzawfhiwnlztzdns/Build/Intermediates/OpenGL Testing.build/Debug/OpenGL Testing.build/Objects-normal/x86_64/textures.o
duplicate symbol _water in:
/Users/me/Library/Developer/Xcode/DerivedData/OpenGL_Testing-epporrdukapbwzawfhiwnlztzdns/Build/Intermediates/OpenGL Testing.build/Debug/OpenGL Testing.build/Objects-normal/x86_64/main.o
/Users/me/Library/Developer/Xcode/DerivedData/OpenGL_Testing-epporrdukapbwzawfhiwnlztzdns/Build/Intermediates/OpenGL Testing.build/Debug/OpenGL Testing.build/Objects-normal/x86_64/textures.o
ld: 4 duplicate symbols for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

我知道这意味着某处存在重复,或者 header 包含多次。但是我所有的 header 都使用#pragma once,而且我已经在工作区中搜索了“dirt”之类的东西,没有其他定义。我的其他标题工作正常,即使是多次包含的标题也是如此。我用不同的关键字多次搜索这个问题,并查看了其他类似的问题,但我发现的只是this SO question。 .

我之前在 Xcode 中遇到过其他“随机”错误 - 例如,一个项目一直试图使用我已删除并替换为静态库的动态库。即使我创建了一个全新的项目,错误仍然存​​在。它在从终端手动编译时有效。

我错过了什么?

最佳答案

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

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

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

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


// textures.cpp
GLuint dirt, water; // variable definitions

你可以有任意多的变量声明(前提是它们都是相同的),所以把声明放在头文件中是可以的,你必须只有一个变量定义,所以你把它放在一个.cpp文件。

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

关于c++ - xcode (C++) 中的随机重复符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18929559/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com