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.h
和MyClass.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的目标文件。