无输入编译

标签 c gcc sh

我正在尝试在 shell 脚本中使用 GCC,但我不想使用输入文件,而是使用包含我的代码的变量。

现在我这样做了:

echo '
#include <stdio.h>

int main(){
  int a=1,b;
  printf("Donnez un nombre : ");
  scanf("%d", &b);
  a+=b;
  printf("test%d\n",a );
  return 0;
}
' > .temp.c
#Entrez le texte ici

gcc .temp.c -o .ex -std=c99

我可以做类似gcc $inputCode -o executable 的事情吗?
此外,如果有人知道我是否可以在不生成任何文件的情况下执行此 c 代码?
谢谢!

最佳答案

你可以这样做:echo whatever | gcc -x c -o .ex - 但我认为这不值得。

一个可能更简洁的替代方案 [您既没有执行 \" 也没有执行 \']。请注意 trap 示例可能不完全正确,但可能是您想要实现的目标。

cat << EOF | gcc -x c -o .ex -
int
main(void)
{
    return 'a';
}
EOF
trap "rm -f .ex" SIGINT
.ex
rm -f .ex

但是,您仍然必须创建输出 ELF 可执行文件文件。部分原因是操作系统需要嵌入式 ELF 加载程序(例如 /lib64/ld-linux-x86-64.so.2)来了解如何加载可执行文件。

我已经多次执行“脚本从源代码创建 C 可执行文件”,我只是创建 .c 和可执行文件,然后再执行 rm。我在 perl 中执行此操作,其中 C 文本出现在 __DATA__ 之后,我执行 unlink 函数调用而不是 rm

关于无输入编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33858132/

相关文章:

c - 为什么包括头文件而不是实现?

c++ - 在 C 或 C++ 中使用 GNU 正则表达式函数

c - 当您使用稍后分配给全局的临时值时,GCC 不会将内联汇编 "=g"输出优化为内存操作数?

shell - 模式匹配 "hdfs ds -ls"输出时如何忽略时间戳?

bash - 根据特定字符串过滤行,然后只打印一些更大的属性

c - 简单的错误C程序

c - C中的汇编代码

c - 将字符串传递给 C 中的函数 - 带或不带指针?

c++ - 在 Mingw 上编译的 C/C++ 代码会保证与 GCC 完全兼容(在 linux 和 Mac 上)

mysql - 用于创建新 SQL 转储的 Shell 脚本