Шапка скрипта для gcc
./a.out
rm a.out
Можно так:
#!/usr/local/bin/tcc -run
#include <stdio.h>
int main
{
printf("Hello World\n");
return 0;
}
#!/bin/sh
tail -n +5 $0 | gcc -o /dev/stdout -xc -| /lib/ld-linux-x86-64.so.2 /dev/stdin $@
exit $?
!#
#include <stdio.h>
int main(int argc, char **argv) {
printf("Hello world\n");
return 0;
}
Как-то так, но оно не работает.
/dev/stdin: error while loading shared libraries: /dev/stdin: file too short
И я не могу понять почему? Вроде линукс следует концепции "всё есть файл", и непонятно почему его собственный лоадер не умеет загружать бинари из пайпа
нету у меня tcc. И на большинстве компов, для которого пишется скрипт, тоже нет
http://stackoverflow.com/questions/13690454/how-to-compile-a...
пишут, что не получится просто так через ld-linux, нужен костыль
пишут, что не получится просто так через ld-linux, нужен костыль
а почему, кстати, нельзя бинарник в tmp сохранить?
а почему, кстати, нельзя бинарник в tmp сохранить?можно, почему нет.
#!/bin/sh
OUT=$(mktemp)
tail -n +10 $0 | gcc -o /dev/stdout -xc -| cat > $OUT
chmod +x $OUT
$OUT $0 $@
RESULT=$?
rm $OUT
exit $RESULT
!#
Вот так работает (я в курсе, что cat лишний, просто проверял, что gcc при выводе в stdout не обрезает файл)
Но это же гораздо менее красиво. И зачем вообще придумали /dev/stdin и /dev/fd/0 как не для использования?
а-ля
$ cat a.cpp
#include <stdio.h>
#include </dev/stdin>
int main {
printf("%s\n", str);
return 0;
}
$ echo "char str[] = \"~~~\";" | g++ a.cpp -o a | ./a
~~~
Оставить комментарий
yroslavasako
Хочу писать скрипты для gcc. Скрипт - это си программа с мейном. Она собирается во временный файл (если можно - просто в память) и запускается скриптом.У кого-нибудь есть готовый шаблон?