GCC能否以跨平台支持的方式编译和运行源代码而不生成任何输出文件(既不是对象也不是可执行文件)?特别是GCC直接支持的解决方案。
我想避免生成任何跟踪文件,因为这是大项目中的次要代码。它只是弄乱了bin目录。
现有问题here为编译源代码提供了解决方案,而不生成任何输出文件,例如:
gcc somefile.c -o /dev/null
但是,这只会编译,并且不会运行。
另一个类似的问题here提供了一个特定于Windows操作系统的解决方案,而不是跨平台的。
答案 0 :(得分:2)
为了编译和运行C / C ++程序然后删除已编译的文件,您应该添加一个函数来在程序执行后删除它。
这是一个删除自身的程序示例的链接。 Click Here
答案 1 :(得分:1)
在您的情况下(您希望避免使构建树混乱),一个实用的解决方案可能是有一些关于临时可执行文件的约定。
例如,您可以决定每个中间可执行文件或文件都被命名为*.tmp
或_*
或*.tmpbin
(用于临时二进制文件)并且有一些Makefile
规则可以删除他们。或者您可以在Makefile
中使用mktemp(1)来获取临时文件名。不要忘记以后删除它。
此外,大多数大型项目都有编译步骤和安装步骤(通常为make install
);如果你没有,你可能应该这样做。您希望安装步骤以避免安装临时二进制文件或文件;使用一些命名约定,这很简单:install
中Makefile
虚假目标的第一个命令将删除这些临时二进制文件或文件。
此外,您通常构建一个与最终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
),以删除生成的可执行文件。
您还可以决定拥有(plugins)dlopen(3)(例如在Linux上使用shared object)。你的主程序可以加载一个插件(在Linux上有Makefile
) - 甚至可能在动态生成其C ++代码并将生成的代码编译成例如Linux上的某些DLL dlopen
(或Windows上的某些do),MELT中的Qt - ,运行.so
获取的函数并卸载插件(在Linux上使用dlsym
),最后卸载dlclose
。您可以使用POCO或https://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
希望它有所帮助;)