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
);如果你没有,你可能应该。您希望安装步骤避免安装临时二进制文件或文件;使用一些命名约定,这非常简单:Makefile
中 install
虚假目标的第一个命令将删除这些临时二进制文件或文件。
此外,您通常在与最终 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
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
);如果你没有,你可能应该。您希望安装步骤避免安装临时二进制文件或文件;使用一些命名约定,这非常简单:Makefile
中 install
虚假目标的第一个命令将删除这些临时二进制文件或文件。
此外,您通常在与最终 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