【发布时间】:2011-04-11 08:16:35
【问题描述】:
我刚刚被来自 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::identity(void)(?identity@0test@@YAXXZ)中引用的未解析外部符号void __cdecl test::identity::view(void)(?view@identity@test@@YAXXZ)
1 identity.obj:错误LNK2019:函数void __cdecl test::identity::identity(void)(?identity@0test@@YAXXZ)中引用的未解析外部符号void __cdecl test::identity::make(void)(?make@identity@test@@YAXXZ)
1 range.obj : 错误 LNK2019: 函数void __cdecl test::range::range(void)(?range@0test@@YAXXZ) 中引用的未解析外部符号void __cdecl test::range::is(void)(?is@range@test@@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 不扁平化文件层次结构?
【问题讨论】:
-
刚刚得到同样的东西,真的很烦人,我们必须手动“修复”它。很高兴你在我面前问。 :)
-
我很久以前就放弃了 SO 搜索。 :) 谷歌。
-
我刚刚在 VS 2013 中解决了一个类似的问题。对我来说,问题是头文件正在被编译,就好像它是一个独立的 C++ 文件一样。所以我最终得到了两个同名的目标文件:一个用于 foo.cpp,一个用于 foo.h。解决方案是转到 foo.h 的正确页面并将 Configuration Properties -> General -> Item Type 更改为“C/C++ header”并进行干净的构建。
-
@AdrianMcCarthy 我遇到了同样的问题,你的建议解决了。
-
@AdrianMcCarthy 的评论是解决方案。一定是由于Add->“New Item”向导自动设置了文件的item类型。
标签: c++ visual-studio visual-c++ visual-studio-2010 visual-c++-2010