GCC可以编译和运行源代码而不生成对象或可执行文件吗?
Can GCC compile and run a source code without generating object or executable files?
GCC能否以跨平台支持的方式编译和运行源代码而不生成任何输出文件(既不是对象文件也不是可执行文件)?
我想避免生成任何跟踪文件,因为这是一个大项目中的小代码。它只是把bin目录弄乱了。
这里存在一个问题,为编译源代码而不生成任何输出文件提供了解决方案,例如:
gcc somefile.c -o /dev/null
但是,这只是编译,而不是运行。
另一个类似的问题提供了一个特定于Windows操作系统的解决方案,而不是跨平台的。
在您的情况下(您希望避免使构建树混乱),一个实际有用的解决方案可能是对临时可执行文件有一些约定。
例如,您可以决定将每个中间可执行文件或文件命名为*.tmp
或_*
或*.tmpbin
(用于临时二进制文件),并使用一些Makefile
规则来删除它们。或者您可以在Makefile
中使用mktemp(1)来获取临时文件名。别忘了以后把它去掉。
而且,大多数大项目都有编译步骤和安装步骤(通常是make install
);如果你没有,你应该有。您希望安装步骤避免安装临时二进制文件或文件;使用一些命名约定,这很简单:Makefile
中install
伪目标的第一个命令将删除这些临时二进制文件或文件。
此外,您通常在不同于最终bin/
目录的文件树中构建,因此您可以将临时可执行文件留在构建树中。
正如一些人注意到的,在Linux上删除它自己的可执行文件很容易(在"/proc/self/exe"
上做一个readlink(2)(详细信息参见proc(5))然后unlink(2) readlink
的结果....),但在Windows上很难。
所以实际上你的问题不是一个非常重要的问题....(如果您使用合适的构建约定)。GCC在文件上工作(因为它会在内部运行ld
来构建可执行文件);然而GCCJIT隐藏了它们。我敢说,你甚至不能使用/dev/stdout
作为gcc
的可执行输出(但是你可以运行gcc -x c /dev/stdin
从stdin编译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
,只运行一次。
你也可以让once
和chmod +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
- 如何将不同的可执行文件合并到一个窗口框架中进行编码?像浏览器一样
- 如何使 windows 命令提示符在C++可执行文件上显示返回值?
- CMake:如何将库 A 链接到库 B,然后将可执行文件链接到库 A
- 如何使字符串出现在编译的二进制可执行文件的开头?
- 程序在使用 system() 启动另一个可执行文件时停止
- 如何更改使用 CPack 安装的可执行文件的名称?
- 在Linux上使用Clang / OLLVM交叉编译helloworld Windows可执行文件时的问题
- CMake:我们可以为一组不形成可执行文件或库的特定文件指定包含目录吗?
- 如何将图像传入C++可执行文件并将输出图像存储在新目录中?
- mingw32-make 使用"MinGW Makefiles"生成器跟踪 CMAKE 无法将可执行文件链接到对象库
- C++模板的对象代码是否在可执行文件和动态库中重复?
- C++ 可执行文件错误:无法打开共享对象文件:没有此类文件或目录
- 如何将C++对象文件链接到C可执行文件
- "make"的输出是一个共享对象,而不是可执行文件
- 如何创建生成文件,为对象和可执行文件指定不同的目录
- 为什么 GNU ld 在链接可执行文件和共享对象时以不同的方式解析符号
- 如何找到C++可执行文件的所有对象(类对象/结构)
- 代码对象和可执行文件的区别
- Android OS框架-将单个可执行文件构建为共享对象
- GCC可以编译和运行源代码而不生成对象或可执行文件吗?