【发布时间】:2015-09-01 10:39:19
【问题描述】:
我在 Visual Studio 2005 上的一个大型项目中遇到了问题,我已经没有什么想法了。
我什至不能放一个工作代码 sn-p 因为我不知道有什么关系,但我会尝试:
我需要让我的项目中的每个 .cpp 文件都有自己的 ID 号,并创建一个知道该 ID 的对象的实例(可全局访问)。 我在此线程How to manage file unique IDs in c++ 上遵循了已接受答案的帮助 并使其在沙盒环境中工作。
添加文件,给他们一个独特的#define FILEID (FileId::ID_FileName)
然后访问他们的实例在沙盒上工作正常。
现在麻烦来了—— 我将使文件知道其IDS的代码粘贴到主项目中,并进行了编译。
到目前为止一切顺利。
现在,我添加到项目中现有的 .cpp 文件之一:
#include "ids.h"
#define FILEID File1 // The FileId corresponding to this file
#include "global.h"
仍在编译,链接,一切都很好。
将这些行添加到项目中的(任何)第二个 .cpp 文件中 现在给出链接错误:
其中:
- name1:第一个文件我添加了行(字母)
- name2:其他不相关的文件名(也可以是我添加行的第二个文件,但也可能只是其他文件)
错误
in name2.obj : error LNK2005: "public static class Instance & __cdecl Manager<3>::getInstance(void)" (?getInstance@$Manager@$02@@SAAAVInstance@@XZ) already defined in name1.obj
有时错误仅出现在第二个文件中,有时(在没有更改的连续构建之间)错误出现在文件夹中的每个 .cpp 文件中。
查看我添加了这些行的文件的中间文件(预处理器输出)恰好显示了
template <>
Instance &Manager<FILEID>::getInstance()
{
static Instance theInstance = getTheFactory().getInstance(FILEID);
return theInstance;
};
使用正确的 FileId::ID_FileName,该名称与其他文件的名称不同。 尽管如此,链接器仍认为在多个文件中使用了相同的 FileId。
在不相关的文件(也给出完全相同的错误)上,根本没有出现getInstance()。显然,链接器应该没有理由在那里大喊大叫。
我检查了,项目中的某处没有 .cpp 文件相互包含。
我完全不知道是什么原因造成的 并希望得到任何帮助。
编辑 1
ids.h
enum FileId{
ID_file1ID=3,//just to see a non zero number in the debugger, which I do
ID_file2ID,
//and so on
FileIdSize
}
编辑 2
当这些错误开始时,编译器开始出现极其意外的行为。
将sdfsdfgasaedfahjk 行添加到任何文件仍然可以编译并通过。
它清楚地说明了该行已添加到编译的文件名。 它清楚地表明它链接到它。 它通过了。
我现在不能相信编译器了。
不知道发生了什么。
【问题讨论】:
-
你能告诉我们
FileId::ID_file1等是如何定义的吗? -
编辑显示 ids.h(就像引用的问题一样)
标签: c++ visual-studio templates c-preprocessor c++03