GCC 可以在不生成目标文件或可执行文件的情况下编译和 运行 源代码吗?

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

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

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

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

gcc somefile.c -o /dev/null

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

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

为了对C/C++程序进行编译和运行,然后删除编译后的文件,需要添加程序执行后删除的功能。

这里有一个 link 程序删除自身的例子。 Click Here

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

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

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

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

正如一些人注意到的那样,删除它自己的可执行文件在 Linux 上很容易(执行 readlink(2) on "/proc/self/exe" (see proc(5) for details) then unlink(2) readlink 的结果......)但在 [=53= 上很难].

所以实际上你的问题不是一个非常重要的问题....(如果你使用合适的构建约定)。和 GCC work on files (because it will run ld internally to build that executable file); however GCCJIT is hiding them. AFAIK, you won't even be able to use /dev/stdout as the executable output of gcc (but you can run gcc -x c /dev/stdin to compile C code from stdin). So GCC cannot avoid making an executable file (but you could have it temporary, or in a tmpfs file system or a FUSE 一个)。因此,您需要 gcc 命令外部的一些东西(可能只是 Makefile 的某些后续行中的 rm)来删除生成的可执行文件。

您也可以决定让 (dynamically loaded) plugins (e.g. use dlopen(3) on Linux). Your main program could load a plugin (with  dlopen on Linux) - perhaps even after having generated dynamically its C++ code and having compiled that generated code into e.g. some shared object .so on Linux (or some DLL on Windows), as I do in MELT -, run functions in it obtained with dlsym, and unload the plugin (with dlclose on Linux) and finally remove it. You might use cross-platform frameworks like Qt or POCO 避免处理 OS 特定的插件代码。

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

#!/bin/bash

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

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

$ sh once any.c

编译 any.c 并且只 运行 它 一次.
您还可以使用 chmod +x once 使 once 可执行,这样您只需键入

$ once any.c

希望对您有所帮助 ;)

对于cgcc/g++ filname.c && ./a.out && rm a.out

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