使用 cl 编译器选项在不同目录中编译的对象



在Windows环境中工作 我遇到了以下问题: 我想告诉 cl 编译器编译(不链接(一些源文件,将其放在指定的目录中,如下所示:

cl /c /FeOBJDIR source.cpp

不幸的是,使用/c 时会忽略/Fe 选项(如我在 https://learn.microsoft.com/en-us/cpp/build/reference/fe-name-exe-file 中发现的那样(。

那我只能写:

cl /FeOBJDIR source.cpp

这实际上将 source.exe 放在 OBJDIR 中,将 source.obj 放在 .\ 中

。但是我需要将 .obj 文件放在与.cpp文件不同的目录中。

您知道如何告诉编译器将目标文件放在指定的目录中吗?

我发现完成这项工作的正确编译器选项是/Fo (https://learn.microsoft.com/en-us/cpp/build/reference/fo-object-file-name(。/Fo 指定要使用的对象 (.obj( 文件名或目录,而不是默认值。它也可以与/c选项一起使用,因此您可以让编译器知道您只需要编译(而不是链接(以及将 .obj 文件放入哪个目录。

在偶然发现这篇文章寻找类似信息之后,虽然是一篇旧帖子,但我想我会为寻找类似信息的其他人添加我学到的东西。

给定以下目录结构;

C:Projects
|
Gimp
|
bin
build
src

(A( - 在此示例中,C:\Projects 目录是我的项目的根目录,此根文件夹可以位于您选择的任何位置,并具有您选择的任何名称。此文件夹中的每个文件夹都可以是您想要的任何项目,具有任何文件夹名称,例如project_1、project_2、project_3等。如图所示,您可以看到此示例的项目文件夹名为 Gimp。

(B( - 在项目文件夹 Gimp 中,我创建了三个文件夹,一个 bin 文件夹,一个构建文件夹和一个 src 文件夹。

  1. bin : 我们.exe的文件夹
  2. build :我们的 .obj 文件的文件夹
  3. src :我们的脚本文件、.c 文件(如果使用 C++.cpp(、.bat 文件等的文件夹

(C( 在 src 文件夹中,我有一个名为 main.c 的 C 源文件,此文件是我的应用程序的入口点。这可以命名为您想要的任何名称,但对于此示例,main.c 是我使用的。我的主.c文件非常简单;

主.c

#include <stdio.h>
int main() 
{
printf_s("******************************************************n");
printf_s("** Gimp v0.0.1 Prototypen");
printf_s("** All work, no play, makes Johnson Doe a dull boy... n");
printf_s("******************************************************n");
return 0;
}

(D(在src文件夹中,我有一个名为build.bat的批处理脚本文件,该文件用于构建我的项目。这可以命名为您想要的任何名称,但对于此示例,build.bat是我使用的。我的构建.bat文件非常简单;

构建.bat

@echo off
rem Build .exe using cl
cl /W4 /Fe:..\bin\gimp.exe /Fo"..\build\" main.c
rem Start gimp.exe
cd ..bin
gimp.exe
cd ..src 

(E( 在 VS 2022 的开发人员命令提示符(这是我用于此项目的命令提示符(中,我遍历到 C:\Projects\Gimp\src 目录,这是我的构建.bat的主页。然后.bat我在命令提示符下运行命令 build,这将触发上面的 build.bat 脚本。

您最感兴趣的部分是">cl/W4/Fe:..\\bin\\gimp.exe/fo"..\\构建\\" main.c"。

根据官方文档,编译器命令行语法是;

CL [选项...] 文件...[选项 | 文件]...[库...][@command文件][/链接链接选择...]

cl     - The Compiler Command-Line executable
/W4    - Sets the output warning level
/Fe    - Renames the executable file
/Fo    - Creates an object file
main.c - My source file/files

如您所见,重命名可执行文件/Fe:.的/Fe: 选项。\\bin\\gimp.exe是我将.exe文件链接到bin文件夹的地方。

创建 .obj 文件/Fo 的/Fo 选项。\\build\\"是我将我的 .obj 文件创建链接到构建文件夹的地方。

最后,我们有一个项目文件夹作为项目的根,我们有子项目文件夹。在这些子项目文件夹中,我们创建了三个子文件夹,bin,build和src。使用从 src 文件夹开始的批处理文件,然后我们使用 cl 命令行选项链接了三个文件夹中的两个。希望这对将来的某人有所帮助。

最新更新