【问题标题】:VisualStudio project with multiple sourcefiles of the same name?具有多个同名源文件的 Visual Studio 项目?
【发布时间】:2012-12-31 02:57:34
【问题描述】:

我有一个较大的 C++ 项目,源文件组织在多个文件夹中(在文件系统上)。

在其中两个文件夹中,我有同名的文件。 例如

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

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

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

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

\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 建议的解决方案 - 为每个有问题的文件设置对象目录 - 在理论上确实有效,但出于实际原因我想避免)

【问题讨论】:

标签: visual-studio-2008 visual-c++ filenames


【解决方案1】:

使用

$(IntDir)%(Directory)

作为“对象文件路径”。

%(Directory) 包含文件的绝对路径,不包括卷和文件名本身。该解决方案至少应在 VS 2019 中工作,并且可以直接应用于项目。

【讨论】:

    【解决方案2】:

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

    $(IntDir)%(RelativeDir)
    

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

    【讨论】:

    • 实际上你需要分隔符和最后的文件名。这为我解决了: $(IntDir)\%(RelativeDir)\%(Filename).obj
    【解决方案3】:

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

    $(InputDir)\$(IntDir)\
    

    只需右键单击文件名而不是项目名称即可仅为该文件设置属性。

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

    这样做的缺点是它可能会使您的源代码树与编译器输出混淆(但希望不会太多),而且 - 更糟糕的是 - 特定于文件的项目设置往往会被遗忘/隐藏,因为它们不是完全在IDE中调用。如果某个时候你(或其他人)需要改变一些东西,那么为什么构建对于特定文件的行为如此奇怪,直到有人用它搞砸了半天直到他们明白发生了什么,这可能是一个谜开。

    我个人更喜欢 $(InputDir)\$(IntDir)\ 的项目范围设置会导致目标文件转到相对于源文件的目录,但实际上它作为项目级别设置根本无法正常工作。在这种情况下,VS 仍然只设置一次输出目录,并且最终相对于列表中的第一个源文件。然后链接器会混淆它应该在哪里查找目标文件。

    【讨论】:

    • 感谢您的输入; $(InputDir)\$(IntDir)\ 看起来很有希望,和/但我真的希望将其作为项目设置(出于所指出的原因),最好甚至在属性表中,因此更改变得显而易见。我不太担心 obj 文件会弄乱我的源代码树(尽管总共生成了数百个 obj 文件)
    • 好吧,这个解决方案对我不起作用。我收到有关“找不到路径 bla bla bla”的错误。所以,我想出了另一个解决方案:我从我的解决方案中排除了“fileWithSameName.cpp”,并添加了另一个“AnotherFile.cpp”,其中只有一行:[include“fileWithSameName.cpp”]。它对我有用
    • 这在 VS 2015 中对我不起作用。但在 stackoverflow.com/questions/3695174/… 建议的稍微不同的属性值确实有效:$(IntDir)/%(RelativeDir)/
    猜你喜欢
    • 2010-10-13
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 2018-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多