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

Visual studio 2008 具有多个同名源文件的VisualStudio项目? 我有一个大的C++项目,源文件在多个文件夹中(文件系统)组织。,visual-studio-2008,visual-c++,filenames,Visual Studio 2008,Visual C++,Filenames,在其中两个文件夹中,我有同名的文件。 e、 g 项目是跨平台的,在Linux和OSX上使用AutoCONF,但是在W32上必须使用MSVC(因为在W32上使用的第三方C++库和编译器之间的C++二进制接口不兼容) 在MSVC方面,项目也被组织成多个“过滤器”(那些虚拟文件夹)(名称大致对应于文件所在的目录),因此我可以区分它们 现在的问题是,当我构建项目时,MSVC将对象文件放在一个平面目录中,我最终得到: \MyProject\Release\Blurp.obj \MyProject\Rele

在其中两个文件夹中,我有同名的文件。 e、 g

项目是跨平台的,在Linux和OSX上使用AutoCONF,但是在W32上必须使用MSVC(因为在W32上使用的第三方C++库和编译器之间的C++二进制接口不兼容)

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

现在的问题是,当我构建项目时,MSVC将对象文件放在一个平面目录中,我最终得到:

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

有没有办法告诉MSVC根据这些文件所在的目录(或过滤器)创建具有唯一名称的对象文件

我想象的是:

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

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

这个问题与类似,但我目前坚持使用VS2008。 (这里为VS2008建议的解决方案——为每个有问题的文件设置对象目录——理论上确实可行,但出于实际原因,我希望避免这种做法)

您可以为一个(或两个)冲突的文件设置特定于文件的项目设置,并将“对象文件名”属性设置为:

$(InputDir)\$(IntDir)\
只需右键单击文件名而不是项目名称,即可仅设置该文件的属性

例如,如果对
\MyProject\foo\File.cpp
执行此操作,则源文件的目标文件将转到
\MyProject\foo\Release\File.obj
,因此它不会与
\MyProject\bar\File.cpp
的目标文件冲突

这样做的缺点是,编译器输出可能会使源代码树变得混乱(但希望不会太多),更糟糕的是,特定于文件的项目设置往往会被遗忘/隐藏,因为它们根本不会在IDE中调用。如果将来某个时候你(或其他人)需要更改某些内容,那么为什么构建对特定文件的行为如此奇怪,这可能是一个相当神秘的问题,直到有人花了半天的时间来处理它,直到他们意识到发生了什么


我个人更希望项目范围内的
$(InputDir)\$(IntDir)\
设置会导致对象文件转到相对于源文件的目录,但作为项目级别的设置,它实际上根本不起作用。在这种情况下,VS仍然只设置一次输出目录,它最终是相对于列表中的第一个源文件的。然后链接器会对应该在哪里查找对象文件感到困惑。

也许您可以将项目范围内的“对象文件名”(配置属性->C/C++->输出文件)设置为

它使用源文件的相对源文件夹。请注意
%
,但如果源文件位于项目目录之外,包含
,则会出现问题。\

使用

$(IntDir)%(Directory)
作为“对象文件路径”


%(目录)
包含文件的绝对路径,不包含卷和文件名本身。此解决方案应至少在VS 2019中有效,并可直接应用于项目。

感谢您的输入$(InputDir)\$(IntDir)\n看起来很有希望,而且/但是我真的希望有一个项目设置(出于所指出的原因),最好是在propertysheet中,因此更改变得很明显。我不太担心obj文件会弄乱我的源代码树(尽管总共生成了数百个obj文件)。好吧,这个解决方案对我不起作用。我得到了一些关于“找不到路径bla bla”的错误信息。因此,我提出了另一个解决方案:我从我的解决方案中排除了“fileWithSameName.cpp”,并添加了另一个解决方案,“AnotherFile.cpp”,其中只有一行:[include“fileWithSameName.cpp]”。在VS 2015中,它对meThis有效,但对我无效。但是在建议的稍有不同的属性值确实有效:$(IntDir)/%(RelativeDir)/实际上,您需要分隔符和文件名作为结尾。这为我解决了:$(IntDir)\%(RelativeDir)\%(Filename)。谢谢!“这是一种魅力。”鲁迪说,这个评论应该是一个答案。这是否回答了你的问题?
$(InputDir)\$(IntDir)\
$(IntDir)%(RelativeDir)
$(IntDir)%(Directory)