【问题标题】:Visual Studio 2012: exclude compiled file from linkingVisual Studio 2012:从链接中排除编译文件
【发布时间】:2014-01-28 15:43:31
【问题描述】:

我有一个简单的 C 语言项目,其中包含一些正在编译的文件。这些被编译成 .obj 文件,然后链接在一起。到目前为止一切顺利,现在我需要从链接中排除其中一个文件。

我知道这很不寻常,但这正是我所需要的:编译文件但不将其链接到项目的输出文件。使用 Visual Studio 2012。

尽管我一直在寻找项目属性和 vcxproj 文件中的各个位置,但我不知道链接器从何处获取要链接的文件。传递已编译文件列表的必须是编译器。是否可以自定义此构建阶段?

在 Visual Studio 2010 中,从链接中排除文件很容易:默认情况下,所有已编译的文件都存储为 $(IntDir)%(FileName).obj。如果 .obj 文件存储在其他地方(在我的情况下它只是 %(FileName).obj),则它没有被链接。 VS2012 似乎链接了所有实际编译的文件,无论它们的位置如何。

如果我将文件名更改为%(FileName).obj.x,没有任何变化,链接器仍然链接它。

我知道我可以将文件编译为构建后事件,但我希望将文件编译为标准构建过程的一部分。

【问题讨论】:

  • IDE 设计师不会花很多时间在添加没有意义的口哨上。如果您不打算使用 .obj 文件的链接,则没有明显的理由编译该文件。如果有,那么你不应该保守秘密。右键单击 .c 文件并选择“从构建中排除”。
  • @HansPassant 原因是我不想链接文件,我需要稍后将其作为外部COFF文件由项目本身加载。不寻常,但在我的具体情况下确实有意义。也许有一种方法可以修改传递给链接器的文件列表,谁知道呢。
  • 只保留一个单独的 lib 项目。
  • @HansPassant 除了 OP 用例之外,我还需要将它用于我想确保继续编译但不包含在链接中的遗留文件,因为稍后我可能需要从文件。将其放入单独的项目是不可接受的,因为项目设置(例如预处理器定义)会影响文件的编译。此外,“从链接中排除”将有助于验证标头在没有任何其他定义的情况下编译。

标签: visual-studio-2012 build linker .obj


【解决方案1】:

让我回答我自己的问题。这个问题有三种解决方案:

  1. 构建后事件编译文件。这样,Visual Studio 对文件一无所知;以标准方式构建它的许多优点都丢失了。

  2. 正如@HansPassant 建议的那样,单独的项目编译文件。这不会阻止链接步骤,因此会生成不必要的文件并且构建速度会慢一些。就我而言,将文件移动到另一个项目是有问题的,因为它自然属于原始项目。

  3. 我使用一开始忽略的预链接事件。我用一个链接的空文件重写了编译文件。这有点棘手,但我可以接受。

【讨论】:

  • 你能详细说明你是怎么做的吗(3)?
  • @BowieOwens 如果我没记错的话,我有一个额外的源文件,它编译成一个空的目标文件。我删除了编译后的文件,并在预链接时重命名了空文件。链接器对此很好。 (编辑:就像“del x.obj && ren y.obj x.obj”作为预链接事件命令)
猜你喜欢
  • 1970-01-01
  • 2019-02-13
  • 1970-01-01
  • 2012-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-25
  • 1970-01-01
相关资源
最近更新 更多