【发布时间】: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