Visual studio 2012 Visual Studio 2012:从链接中排除已编译文件

Visual studio 2012 Visual Studio 2012:从链接中排除已编译文件,visual-studio-2012,build,linker,.obj,Visual Studio 2012,Build,Linker,.obj,我有一个简单的C语言项目,有几个文件正在编译。这些文件被编译成.obj文件,然后链接在一起。到目前为止还不错,现在我需要从链接中排除其中一个文件 我知道这很不寻常,但这正是我需要的:编译一个文件,但不要将它链接到项目的输出文件。使用Visual Studio 2012 我不知道链接器从哪里获取要链接的文件,尽管我一直在查看项目属性和vcxproj文件中的各个位置。传递已编译文件列表的必须是编译器。是否可以自定义此构建阶段 在VisualStudio2010中,很容易从链接中排除文件:默认情况下,

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

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

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

在VisualStudio2010中,很容易从链接中排除文件:默认情况下,所有编译的文件都存储为
$(IntDir)%(FileName).obj
。如果.obj文件存储在其他位置(在我的例子中,它只是
%(文件名).obj
),它就没有链接。VS2012似乎链接了所有实际编译的文件,而不考虑它们的位置

如果我将文件名更改为
%(FileName).obj.x
,则不会发生任何更改,链接器仍会链接它


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

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

  • 生成后事件编译该文件。这样,VisualStudio对文件一无所知;以标准方式构建它的许多优势已经丧失

  • 正如@HansPassant所建议的,单独的项目编译该文件。这不会阻止链接步骤,因此会生成不必要的文件,并且生成速度会稍慢。在我的例子中,将文件移动到另一个项目是有问题的,因为它自然属于原始项目

  • 我使用了我一开始忽略的链接前事件。我用一个链接的空文件重写编译后的文件。这有点棘手,但对我来说可以接受


  • IDE设计人员不会花太多时间添加毫无意义的口哨。如果您不打算使用.obj文件的链接,那么就没有可感知的理由编译该文件。如果有的话,你就不应该保守秘密。右键单击.c文件并选择“从构建中排除”。@HansPassant原因是我不想链接该文件,我需要稍后由项目本身将其作为外部COFF文件加载。不寻常,但在我的具体案例中,它确实有意义。也许有一种方法可以修改传递给链接器的文件列表,谁知道呢。只需保留在一个单独的lib项目中即可。@HansPassant除了OP用例之外,我还需要将其用于一个遗留文件,我想确保该文件继续编译,但不包括在链接中,因为以后我可能需要从该文件中提取代码。将其放入单独的项目是不可接受的,因为项目设置(例如预处理器定义)会影响文件的编译。此外,“从链接中排除”将有助于验证头是否在没有任何其他定义的情况下编译。能否详细说明您是如何编译的(3)?@BowieOwens如果我记得很清楚,我有一个额外的源文件,该文件编译为空的对象文件。我删除了编译后的文件,并在预链接时重命名了空文件。链接器对此没有问题。(编辑:它类似于“del x.obj&&ren y.obj x.obj”作为预链接事件命令)