2013-01-16 160 views
5

我有一个庞大的C++项目,源文件组织在多个文件夹中(在文件系统上)。具有多个相同名称的源文件的VisualStudio项目?

在这两个文件夹中,我具有相同名称的文件。 例如

\MyProject\foo\Blurp.cpp 
\MyProject\foo\File.cpp 
\MyProject\bar\File.cpp 
\MyProject\bar\Knoll.cpp 

项目是跨平台的,我用在Linux和OSX autoconf的,但必须使用MSVC在W32(由于一些第三方C++库我碰到编译器使用的W32和C++二进制接口不兼容)

在MSVC方面,项目也被组织成多个“过滤器”(这些虚拟文件夹)(名称大致对应于文件所在的目录),所以我可以区分它们。

现在的问题是,当我生成项目,MSVC放在一个单一的扁平diretory的目标文件,和我结束了:

\MyProject\Release\Blurp.obj 
\MyProject\Release\File.obj 
\MyProject\Release\Knoll.obj 

可以看出,只有一个File.obj,使一个二进制对象丢失。显然,链接器会抱怨,因为它找不到在该缺失对象文件中定义的类/函数/ ...。

有没有办法告诉MSVC创建具有唯一名称的目标文件,具体取决于这些文件所在的目录(或过滤器)?

我想是这样的:

\MyProject\Release\foo\Blurp.obj 
\MyProject\Release\foo\File.obj 
\MyProject\Release\bar\File.obj 
\MyProject\Release\bar\Knoll.obj 

\MyProject\Release\foo-Blurp.obj 
... 

或什么的。 我知道的所有其他构建系统(CMake,autotools)都能够处理多个同名文件。

这个问题类似于3729515,但我目前坚持VS2008。 (VS2008中提供的解决方案 - 为每个文件设置对象目录 - 理论上确实有效,但我想避免出于实际原因)

回答

6

您可以设置一个file-具体项目设置的冲突,并设置“目标文件名”中的一个文件(或两者)属性:

$(InputDir)\$(IntDir)\ 

只需右键单击文件名,而不是项目的名称来设置该属性仅文件。

例如,如果你这样做了\MyProject\foo\File.cpp那么该源文件的目标文件将转到\MyProject\foo\Release\File.obj,因此它不会与目标文件\MyProject\bar\File.cpp相冲突。

这样做的缺点是它可以使编译器输出混乱你的源代码树(但希望没有太多),甚至更糟 - 文件特定的项目设置往往会被遗忘/隐藏,因为它们是根本不在IDE中调用。如果有时候你(或其他人)需要改变一些东西,那么为什么构建对特定文件的行为如此奇怪,直到有人将它旋转半天直到它明白了将要发生的事情,这可能是一个谜。上。

我个人更喜欢$(InputDir)\$(IntDir)\这个项目范围的设置会导致目标文件进入相对于源文件的目录,但它实际上并不能很好地作为项目级设置运行。在这种情况下,VS仍然只设置输出目录一次,并且它最终与列表中的第一个源文件相关。然后链接器会对应该在哪里查找目标文件感到困惑。

+0

感谢您的输入; $(InputDir)\ $(IntDir)\看起来很有希望,并且/但我真的希望有一个项目设置(出于原因指出),最好甚至在一个propertysheet中,所以变化变得明显。我不关心obj文件混乱我的源代码树(尽管总共有几百个obj文件生成) –

+0

嗯,这个解决方案并没有为我工作。我得到了一些关于“找不到路径bla bla bla”的错误。所以,我想出了另一个解决方案:我从我的解决方案中排除了“fileWithSameName.cpp”,并添加了另一个“AnotherFile.cpp”,它里面只有一行:[include“fileWithSameName.cpp”]。它为我工作 – Illidan

+3

这不适用于我在VS 2015.但稍有不同的属性值建议在https://stackoverflow.com/questions/3695174/visual-studio-2010s-strange-warning-lnk4042/3731643# 3731643确实工作:$(IntDir)/%(RelativeDir)/ – peastman

8

也许你可以设置项目范围“目标文件名”(Configurtion属性 - > C/C++ - >输出文件),以

$(IntDir)%(RelativeDir) 

它使用源文件的相对源文件夹。注意%,但如果您的源文件位于您的项目目录之外,则会变得很难看,其中包含..\

+1

其实你需要分隔符和文件名在最后。这为我解决了这个问题: $(IntDir)\%(RelativeDir)\%(Filename).obj – Rudi

+0

谢谢!充当魅力。 –

相关问题