Xcode LD:8 个重复符号,用于架构x86_64
xcode ld: 8 duplicate symbols for architecture x86_64
我正在用 GLUT 和 OpenGL 制作一个 xcode 和 c++ 游戏。我想在我的游戏中放置一个 3D 模型,这是头文件的一般外观:
unsigned int GunNumVerts = 37812;
float GunVerts [] = {
// f 1/1/1 1582/2/1 4733/3/1
0.266494348503772, 0.0252334302709736, -0.000725898139236535,
0.265592372987502, 0.0157389511523397, -0.000725898139236535,
0.264890836474847, 0.0182004476109518, -0.00775888079925833,}
float GunNormals [] = {
// f 1/1/1 1582/2/1 4733/3/1
0.986904930120225, -0.0937549933614904, -0.131257990706016,
0.986904930120225, -0.0937549933614904, -0.131257990706016,
0.986904930120225, -0.0937549933614904, -0.131257990706016,}
float GunTexCoords [] = {
// f 1/1/1 1582/2/1 4733/3/1
0.110088, 0.229552,
0.108891, 0.243519,
0.119508, 0.240861,}
我收到此错误:
duplicate symbol _GunNumVerts in: /blah/blah/blah/Mouse.o
/blah/blah/blah/ViewPort.o
ld: 8 duplicate symbols for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
我正在尝试在我的视口中的显示方法中显示它,如下所示:
glVertexPointer(3, GL_FLOAT, 0, GunVerts);
glNormalPointer(GL_FLOAT, 0, GunNormals);
glTexCoordPointer(2, GL_FLOAT, 0, GunTexCoords);
glDrawArrays(GL_TRIANGLES, 0, GunNumVerts);
我还有其他 7 个重复的符号小短语,但只有一个实际错误。
您在标头中定义了变量。这样,每个变量都存在于每 (8) 个编译单元中。而是在标头中声明变量并在.cpp文件中定义它们。
例如:
// Gun.h:
extern unsigned int GunNumVerts;
extern float GunVerts[9];
// Gun.cpp:
unsigned int GunNumVerts;
float GunVerts[9] = {
// f 1/1/1 1582/2/1 4733/3/1
0.266494348503772, 0.0252334302709736, -0.000725898139236535,
0.265592372987502, 0.0157389511523397, -0.000725898139236535,
0.264890836474847, 0.0182004476109518, -0.00775888079925833};
extern
告诉编译器变量的地址稍后解析(由链接器解析)。此外,如果您从不打算在运行时更改这些值,则应将它们声明为 const
。
/编辑:由于您使用的是具有非常好的 C++11 支持的 clang,因此您也可以对这些值使用 constexpr
。然后它们仅驻留在标头中。但是,了解链接器对于C++开发人员非常重要,因此保留原始建议。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 用于访问容器<T>数据成员的正确 API
- 重载操作程序时出错>>用于类中的字符串 memebr
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- C++中的cin.ignore()函数不适用于整个流
- 没有用于初始化C++中的变量模板的匹配构造函数
- 用于C++中带有数组和指针的循环
- 为什么它不适用于Visual 2019的原因
- 使用在用于SFINAE的void_t中具有参数的方法
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- 重载==不适用于二进制树
- Insert函数不适用于2 if语句C++
- 用于矢量处理的多个线程
- 将内联程序集尾调用函数尾声替换为用于x86/x64 msvc的Intrinsics
- C DLL通过C#UWP应用程序中的Win运行时组件适用于ARM,但对于X86/X64不适用于
- C++指针到方法模板推导在面向 x86 时不编译,但适用于 x64
- 用于调试X86构建的Visual Studio链接器错误
- 将c#代码转换为c++本机代码或用于x86处理器
- 用于 x86/64 的 Itanium 交叉编译器