我刚刚被来自 Visual Studio 2010 (C++) 的一些重要警告打得头破血流。
编译给出了以下输出:
1 Debug\is.obj : 警告 LNK4042:对象指定了不止一次;额外被忽略
1 Debug\make.obj:警告 LNK4042:对象指定了多次;额外被忽略
1 Debug\view.obj:警告LNK4042:对象指定了不止一次;额外被忽略
1 identity.obj:错误LNK2019:无法解析的外部符号
void __cdecl test::identity::view(void)
(?view@identity@test@@YAXXZ)在函数void __cdecl test::identity::identity(void)
(?identity@0test@@YAXXZ)中引用1 identity.obj:错误LNK2019:无法解析的外部符号
void __cdecl test::identity::make(void)
(?make@identity@test@@YAXXZ)在函数void __cdecl test::identity::identity(void)
(?identity@0test@@YAXXZ)中引用1 range.obj:错误LNK2019:无法解析的外部符号
void __cdecl test::range::is(void)
(?is@range@test@@YAXXZ)在函数void __cdecl test::range::range(void)
(?range@0test@@YAXXZ)中引用
链接器错误总是很难调试……但是有未解决的引用,所以我检查了……但源代码格式正确……最后它击中了我:
我的文件夹层次结构如下所示:
src/
identity/
is.cpp
make.cpp
view.cpp
range/
is.cpp
make.cpp
view.cpp
解决方案中的层次结构也是如此(我总是将其设置为模仿“真实”文件夹结构)。
诊断输出:
Debug\is.obj
Debug\make.obj
Debug\view.obj
伴随着一条警告说 .obj
已被传递给链接器两次,并且将被忽略。
不再搜索:Visual 已经整齐地展平了我的文件夹层次结构,因此无法整齐地编译源代码。
目前,我只是想重命名文件,这应该涵盖这个问题……
…但是有没有办法让 Visual Studio 不展平文件层次结构?
原文由 Matthieu M. 发布,翻译遵循 CC BY-SA 4.0 许可协议
只是想交叉发布我认为的答案,如果您打开整个项目的属性,并将
C/C++ -> Output Files -> "Object File Name"
下的值更改为以下内容:$(IntDir)/%(RelativeDir)/
在 VS 2010 下,我相信这将消除所有对象文件的歧义(因为我相信 Windows 在任何疯狂的情况下都不会让你在同一个目录中有两个同名的文件)。另请在 此处 查看详细信息。