Visual Studio 2010的奇怪“警告LNK4042”

我刚刚被Visual Studio 2010(C ++)的一些不小的警告殴打(相当难)。

汇编给出了以下输出:

1 Debug \ is.obj:警告LNK4042:多次指定对象; 额外部分被忽略
1 Debug \ make.obj:警告LNK4042:多次指定对象; 额外部分被忽略
1 Debug \ view.obj:警告LNK4042:多次指定对象; 额外部分被忽略
1 identity.obj:error LNK2019:无法parsing的外部符号void __cdecl test::identity::view(void) (?view @ identity @ test @@ YAXXZ) void __cdecl test::identity::identity(void) ( ?身份@ 0test @@ YAXXZ)
1 identity.obj:error LNK2019:无法parsing的外部符号void __cdecl test::identity::make(void) (?make @ identity @ test @@ YAXXZ) void __cdecl test::identity::identity(void) ( ?身份@ 0test @@ YAXXZ)
1 range.obj:error LNK2019:无法parsing的外部符号void __cdecl test::range::is(void) (?是@ range @ test @@ YAXXZ) void __cdecl test::range::range(void) ( ?范围@ 0test @@ YAXXZ)

链接器错误总是一个痛苦的debugging…但有没有解决的引用,所以我检查了…但源码格式正确…最后它打我:

我的文件夹层次结构如下所示:

 src/ identity/ is.cpp make.cpp view.cpp range/ is.cpp make.cpp view.cpp 

解决scheme中的层次结构也是如此(我总是将其设置为模仿“真实”文件夹结构)。

诊断结果:

 Debug\is.obj Debug\make.obj Debug\view.obj 

除了一个警告,说.obj已经两次传递给链接器,那个将被忽略。

search没有更多:Visual整齐地压扁我的文件夹层次结构,因此无法整齐地编译源。

目前,我只是想重命名文件,这应该涵盖这个问题…

…但有没有一种方法让Visual Studio不平坦的文件层次?

只是想交叉发表我相信是的答案,如果你打开整个项目的属性,并将C/C++ -> Output Files -> "Object File Name"下的值更改为以下内容:

$(IntDir)/%(RelativeDir)/

在VS 2010中,我相信这将消除所有的目标文件(因为我相信windows不会让你在任何疯狂的情况下在同一个目录下有两个同名的文件)。 请在这里查看详情。

链接器警告LNK4042:对象指定了多次; 额外部分被忽略 。 在我的情况下,Visual Studio试图编译头文件和源文件的名称相同 – MyClass.hMyClass.cpp 。 发生这种情况是因为我将.cpp文件重命名为.h ,Visual Studio感到困惑。 我通过查看Debug目录中的编译器日志来注意到这个问题。 解决刚从项目中删除.h文件,然后再次添加它。

右键单击解决scheme资源pipe理器窗口中的.cpp文件,属性,C / C ++,输出文件,对象文件名设置。 默认是$(IntDir)\ ,这就是做扁平化。 所有.obj文件将进入debuggingconfiguration中的“Debug”目录$(IntDir)。

你可以改变设置,比如$(IntDir)\is2.obj 。 或者从一个组中select所有文件(使用Shift + Click)并将设置更改为,例如$(IntDir)\identity\

或者您可以更改.cpp文件名,以便.obj文件不会相互覆盖。 在两个目录中具有完全相同的名称的文件有点奇怪。

或者您可以创build多个项目,为身份和范围内的文件创build.lib项目。 例如,通常在makefile项目中完成。 不过,除非使用项目属性表,否则pipe理编译和链接设置更麻烦。

我有这个stdafx.cpp的问题。 不知何故stdafx.cpp得到了重复,所以有第二个StdAfx.cpp(介意不同的情况)。

我删除了StdAfx.cpp后,一切工作正常!

使用VS 2010。

除了删除和创build新文件,您可以更改编译/包含设置。

转到你的project.vcxproj文件,用编辑器打开它,find像<ItemGroup>这样的html。

它应该看起来像这样:

<ItemGroup>

<ClCompile Include="implementation.cpp" />

</ItemGroup>

<ItemGroup>

<ClInclude Include="declaration.hpp" />

</ItemGroup>

假设你的实现文件是.cpp,你的声明是.hpp。 确保你的所有实现文件在第一节之间列出,如果你有多个声明文件,第二节也是如此。

右键单击头文件 – > Property – > ItemType(selectC / C ++ Header)。 用Cpp文件做同样的事情,但selectC / C ++ COmpiler(这对我来说很有用)

我使用$(IntDir)\%(目录)\ C / C ++下 – >输出文件 – >“对​​象文件名”。

我曾经在相同的项目.c.cpp文件具有相同的文件名 。 这些文件都在文件夹中,其他人提供的解决scheme创造了一个混乱,文件夹地狱(在我的情况)。 即使发布版本也会覆盖Debug版本!

一个好的(不是完美的)解决scheme是使用$(ParentName),但是出于某种原因,除了任何人的把握,它已经从Visual Studio(2015+)的更高版本中删除。

我现在成功使用的是:$(IntDir)%(Filename)%(Extension).obj

它至less从.cpp中分离出.c构build的目标文件。