我正在研究我的引擎的核心,我在Microsoft Visual c ++ express中遇到了严重的链接问题.
为了简化问题,导致问题的是这两个头文件,每个头文件都有一个具有不同标识符的命名空间.这两个文件实际上包含了彼此.编译时没有错误,但是在链接时,错误显示"X已在A.obj中定义".下面提供了一个示例:
HEADER 1
#ifndef HEADER1_H
#define HEADER1_H
#include "header2.h"
namespace Core{
int x, y, z;
}
#endif
Run Code Online (Sandbox Code Playgroud)
HEADER 2
#ifndef HEADER2_H
#define HEADER2_H
#include "header1.h"
namespace GUI{
int x, y, z;
}
#endif
Run Code Online (Sandbox Code Playgroud)
最终发生的是我得到一个错误,指出x,y和z变量已经在创建的第一个.obj文件中定义.我假设因为变量来自不同的命名空间,所以它们不会发生碰撞.我也有标题保护,因此头文件似乎不会被多次包含.
无论如何,任何形式的帮助或建议将不胜感激.我被困在这3天左右:P.另外,如果我没有提供足够的信息,请告诉我,这只是我目前的代码非常长.
干杯,乔伊
实际上,问题是变量是在头文件中定义的 - 不是头文件包含的,是包含头的每个.cpp文件中的变量,所有6个变量都被定义.
每个.cpp文件都变成一个.o文件,每个.o都以定义的变量结束,这会导致链接器错误.你想要做的是在标题中使用extern关键字,它告诉编译器实际变量是在别处定义的......
例如:
namespace Core{
extern int x, y, z;
}
Run Code Online (Sandbox Code Playgroud)
和
namespace GUI{
extern int x, y, z;
}
Run Code Online (Sandbox Code Playgroud)
然后,在一个cpp文件中(只在一个cpp文件中!)你需要定义没有 extern 的变量
namespace Core {
int x, y, z;
}
namespace GUI{
int x, y, z;
}
Run Code Online (Sandbox Code Playgroud)
这将修复您的链接器错误.
| 归档时间: |
|
| 查看次数: |
2326 次 |
| 最近记录: |