Самый простой способ исправить это - установить пакет разработчика QT:
sudo apt-get install qt5-default
Это установит нужные вам пакеты.
Для C вы можете взглянуть на tcc , Tiny C Compiler. Запуск кода на C в качестве сценария является одним из его возможных применений.
$ cat /usr/local/bin/runc
#!/bin/bash
sed -n '2,$p' "$@" | gcc -o /tmp/a.out -x c++ - && /tmp/a.out
rm -f /tmp/a.out
$ cat main.c
#!/bin/bash /usr/local/bin/runc
#include <stdio.h>
int main() {
printf("hello world!\n");
return 0;
}
$ ./main.c
hello world!
Команда sed берет файл .c
и удаляет строку хэша. 2,$p
означает печать строк 2 до конца файла; "$@"
распространяется на аргументы командной строки для сценария runc, т.е. "main.c"
.
вывод sed передается в gcc. Передача -
в gcc указывает ему читать из stdin, и когда вы делаете это, вы также должны указать исходный язык с помощью -x
, поскольку у него нет имени файла, из которого можно угадать.
CINT :
CINT - интерпретатор кода C и C ++. Это полезно, например для ситуаций, когда быстрое развитие более важно, чем время выполнения. Использование интерпретатора значительно сокращает цикл компиляции и компоновки, что способствует быстрой разработке. CINT делает программирование на C / C ++ приятным даже для программистов, занятых неполный рабочий день.
Возможно, вы захотите проверить ryanmjacobs / c , который был разработан для этого. Он действует как обертка вокруг вашего любимого компилятора.
#!/usr/bin/c
#include <stdio.h>
int main(void) {
printf("Hello World!\n");
return 0;
}
Приятной особенностью использования c
является то, что вы можете выбрать, какой компилятор вы хотите использовать, например
$ export CC=clang
$ export CC=gcc
Так что вы получаете все свои любимые оптимизации тоже! Удар, что tcc -run
!
Вы также можете добавить флаги компилятора в shebang, если они заканчиваются символами --
:
#!/usr/bin/c -Wall -g -lncurses --
#include <ncurses.h>
int main(void) {
initscr();
/* ... */
return 0;
}
c
также использует $CFLAGS
и $CPPFLAGS
, если они также установлены.
Я знаю, что этим вопросом не является недавний, но я решил бросить свой ответ в соединение так или иначе. С Лязгом и LLVM, нет никакой потребности выписать промежуточный файл или назвать внешнюю программу/сценарий помощника. (кроме лязга/лязга ++/lli)
можно просто передать вывод по каналу лязга/лязга ++ к lli.
#if 0
CXX=clang++
CXXFLAGS="-O2 -Wall -Werror -std=c++17"
CXXARGS="-xc++ -emit-llvm -c -o -"
CXXCMD="$CXX $CXXFLAGS $CXXARGS [110]"
LLICMD="lli -force-interpreter -fake-argv0=[110] -"
$CXXCMD | $LLICMD "$@" ; exit $?
#endif
#include <cstdio>
int main (int argc, char **argv) {
printf ("Hello llvm: %d\n", argc);
for (auto i = 0; i < argc; i++) {
printf("%d: %s\n", i, argv[i]);
}
return 3==argc;
}
Вышеупомянутое однако не позволяет Вам использовать stdin в своем c/c ++ сценарий. Если удар является Вашей оболочкой, то можно сделать следующее для использования stdin:
#if 0
CXX=clang++
CXXFLAGS="-O2 -Wall -Werror -std=c++17"
CXXARGS="-xc++ -emit-llvm -c -o -"
CXXCMD="$CXX $CXXFLAGS $CXXARGS [111]"
LLICMD="lli -force-interpreter -fake-argv0=[111]"
exec $LLICMD <($CXXCMD) "$@"
#endif
#include <cstdio>
int main (int argc, char **argv) {
printf ("Hello llvm: %d\n", argc);
for (auto i = 0; i < argc; i++) {
printf("%d: %s\n", i, argv[i]);
}
for (int c; EOF != (c=getchar()); putchar(c));
return 3==argc;
}
Поскольку строка shebang будет передана компилятору, а # указывает директиву препроцессора, она подавится на # !.
Что вы можете сделать, так это встроить make-файл в файл .c (как описано в this xkcd thread ).
#if 0
make $@ -f - <<EOF
all: foo
foo.o:
cc -c -o foo.o -DFOO_C $0
bar.o:
cc -c -o bar.o -DBAR_C $0
foo: foo.o bar.o
cc -o foo foo.o bar.o
EOF
exit;
#endif
#ifdef FOO_C
#include <stdlib.h>
extern void bar();
int main(int argc, char* argv[]) {
bar();
return EXIT_SUCCESS;
}
#endif
#ifdef BAR_C
void bar() {
puts("bar!");
}
#endif
Пара #if 0 #endif
, окружающая make-файл, гарантирует препроцессор игнорирует этот фрагмент текста, а маркер EOF отмечает, где команда make должна прекратить синтаксический анализ ввода.
Вариатн Джона Кугельмана можно записать так:
#!/bin/bash
t=`mktemp`
sed '1,/^\/\/code/d' "$0" | g++ -o "$t" -x c++ - && "$t" "$@"
r=$?
rm -f "$t"
exit $r
//code
#include <stdio.h>
int main() {
printf("Hi\n");
return 0;
}