
在我的项目中(一个非常简单的OpenGL游戏的开头)我有两个文件:
textures.h:
#pragma once#include <gluT/gluT.h>voID load(); // load texturesgluint 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变量以绑定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.oduplicate 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.oduplicate 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.oduplicate 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.old: 4 duplicate symbols for architecture x86_64clang: error: linker command Failed with exit code 1 (use -v to see invocation)
我知道这意味着某处有重复,或者多次包含标题.但是我的所有标题都使用#pragma一次,我在工作区中搜索了“污垢”等等,并且没有其他定义.我的其他标题工作正常,甚至是多次包含的标题.我用不同的关键词多次搜索这个问题,并看了其他类似的问题,但我发现的只有this SO question.
我之前在Xcode中遇到过其他“随机”错误 – 例如,一个项目一直试图使用我删除的动态库并用静态库替换.即使我创建了一个全新的项目,错误仍然存在.它从终端手动编译时起作用.
我错过了什么?
解决方法 #pragma once不会停止多次包含头文件.在编译单个文件时,它会停止多次包含头文件.您有(至少)三个文件,因此您要声明相同的变量3次.
不要将变量定义放在头文件中.这样做
// textures.hextern gluint dirt,water; // variable declarations// textures.cppgluint dirt,water; // variable deFinitions
您可以根据需要使用尽可能多的变量声明(前提是它们都相同),因此可以将声明放在头文件中,您必须只有一个变量定义,因此将其放在.cpp文件中.
要记住的关键是每个.cpp文件都完全独立于其他所有.cpp文件进行编译,这称为单独编译.所以你的想法#pragma曾经会阻止一个.cpp文件包含一个头文件只是因为它已被包含在另一个.cpp文件中不起作用.你不是第一个误解这个的人.
总结以上是内存溢出为你收集整理的xcode中的随机重复符号(C)全部内容,希望文章能够帮你解决xcode中的随机重复符号(C)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)