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

时间:2015-07-14 05:00:02

标签: c++ gcc makefile cross-platform

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

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

现有问题here编译源代码提供了解决方案,而不生成任何输出文件,例如:

gcc somefile.c -o /dev/null

但是,这只会编译,并且不会运行。

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

3 个答案:

答案 0 :(得分:2)

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

这是一个删除自身的程序示例的链接。 Click Here

答案 1 :(得分:1)

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

例如,您可以决定每个中间可执行文件或文件都被命名为*.tmp_**.tmpbin(用于临时二进制文件)并且有一些Makefile规则可以删除他们。或者您可以在Makefile中使用mktemp(1)来获取临时文件名。不要忘记以后删除它。

此外,大多数大型项目都有编译步骤和安装步骤(通常为make install);如果你没有,你可能应该这样做。您希望安装步骤以避免安装临时二进制文件或文件;使用一些命名约定,这很简单:installMakefile虚假目标的第一个命令将删除这些临时二进制文件或文件。

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

正如一些人注意到的那样,在Linux上删除自己的可执行文件很容易(在"/proc/self/exe"readlink(2)(有关详细信息,请参阅proc(5)),然后unlink(2) GCC的结果{ {1}} ....)但在Windows上很难。

所以实际上你的问题不是一个非常重要的问题....(如果你使用合适的构建约定)。并且GCCJIT处理文件(因为它将在内部运行readlink来构建该可执行文件);但是tmpfs隐藏了它们。 AFAIK,您甚至无法使用ld作为/dev/stdout的可执行输出(但您可以运行gcc stdin 编译C代码) 。所以 GCC无法避免制作可执行的文件 (但您可以暂时使用它,或者在FUSE文件系统或dynamically loaded文件系统中。因此,您需要gcc -x c /dev/stdin命令外部的某些内容(在gcc的某些后续行中可能只需要rm),以删除生成的可执行文件。

您还可以决定拥有(pluginsdlopen(3)(例如在Linux上使用shared object)。你的主程序可以加载一个插件(在Linux上有Makefile) - 甚至可能在动态生成其C ++代码并将生成的代码编译成例如Linux上的某些DLL dlopen(或Windows上的某些do),MELT中的Qt - ,运行.so获取的函数并卸载插件(在Linux上使用dlsym),最后卸载dlclose。您可以使用POCOhttps://jsfiddle.net/kw8kv7vr/等跨平台框架来避免处理特定于操作系统的插件代码。

答案 2 :(得分:1)

简单的bash脚本可能有所帮助:

#!/bin/bash

echo 'compile... ' $1
gcc $1 && ./a.out && rm a.out

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

$ sh once any.c

编译any.c并运行一次 您还可以使用once生成chmod +x once可执行文件,以便输入

$ once any.c

希望它有所帮助;)