GCC可以编译和运行源代码而不生成对象或可执行文件吗?

Can GCC compile and run a source code without generating object or executable files?

本文关键字:对象 可执行文件 编译 源代码 运行 GCC      更新时间:2023-10-16

GCC能否以跨平台支持的方式编译和运行源代码而不生成任何输出文件(既不是对象文件也不是可执行文件)?

我想避免生成任何跟踪文件,因为这是一个大项目中的小代码。它只是把bin目录弄乱了。

这里存在一个问题,为编译源代码而不生成任何输出文件提供了解决方案,例如:

gcc somefile.c -o /dev/null

但是,这只是编译,而不是运行。

另一个类似的问题提供了一个特定于Windows操作系统的解决方案,而不是跨平台的。

在您的情况下(您希望避免使构建树混乱),一个实际有用的解决方案可能是对临时可执行文件有一些约定

例如,您可以决定将每个中间可执行文件或文件命名为*.tmp_**.tmpbin(用于临时二进制文件),并使用一些Makefile规则来删除它们。或者您可以在Makefile中使用mktemp(1)来获取临时文件名。别忘了以后把它去掉。

而且,大多数大项目都有编译步骤和安装步骤(通常是make install);如果你没有,你应该有。您希望安装步骤避免安装临时二进制文件或文件;使用一些命名约定,这很简单:Makefileinstall伪目标的第一个命令将删除这些临时二进制文件或文件。

此外,您通常在不同于最终bin/目录的文件树中构建,因此您可以将临时可执行文件留在构建树中。

正如一些人注意到的,在Linux上删除它自己的可执行文件很容易(在"/proc/self/exe"上做一个readlink(2)(详细信息参见proc(5))然后unlink(2) readlink的结果....),但在Windows上很难。

所以实际上你的问题不是一个非常重要的问题....(如果您使用合适的构建约定)。GCC在文件上工作(因为它会在内部运行ld来构建可执行文件);然而GCCJIT隐藏了它们。我敢说,你甚至不能使用/dev/stdout作为gcc的可执行输出(但是你可以运行gcc -x c /dev/stdinstdin编译C代码)。因此,GCC无法避免生成可执行的文件(但您可以将其临时设置为tmpfs文件系统或FUSE文件系统)。因此,您需要gcc命令外部的一些东西(可能是Makefile下面的rm)来删除生成的可执行文件。

你也可以决定使用(动态加载的)插件(例如在Linux上使用dlopen(3))。你的主程序可以加载一个插件(在Linux上使用dlopen) -也许甚至在动态生成其c++代码并将生成的代码编译成例如Linux上的一些共享对象.so(或Windows上的一些DLL)之后,就像我在MELT中所做的那样,运行dlsym获得的函数,并卸载插件(在Linux上使用dlclose),最后remove它。您可以使用跨平台框架,如Qt或POCO,以避免处理操作系统特定的插件代码。

一个简单的bash脚本可能会有帮助:

#!/bin/bash
echo 'compile... ' $1
gcc $1 && ./a.out && rm a.out

假设它被命名为once,那么你可以执行

$ sh once any.c

编译any.c,只运行一次
你也可以让oncechmod +x once一起执行所以你可以输入

$ once any.c

希望有帮助;)

为了编译并运行C/c++程序,然后删除编译后的文件,您应该在程序执行后添加一个函数来删除程序。

这是一个程序自我删除的示例链接。点击这里

For c gcc/g++ filname.c && ./a.out && rm a.out

c++ g++ filename.cpp && ./a.out && rm a.out

相关文章: