Ich versuche, die Yocto-Poky-Umgebung zu verwenden. Ich habe Folgendes getan:
#source environment-setup-cortexa9hf-neon-poky-linux-gnueabi
Wenn ich nun versuche, das Programm mit folgendem Befehl zu kompilieren:
#$(CC) hello.c -o hello.elf
es gibt einen Fehler aus, da $(CC)
es nicht definiert ist.
Wenn ich $CC
das jedoch tue, funktioniert es. Ich bin verwirrt, was der grundlegende Unterschied zwischen $(CC) und ist $CC
?
Antwort1
Ich gehe davon aus, dass Sie es in einem Makefile gesehen haben, $(CC)
wo es als Erweiterung der Variable dient CC
, die normalerweise den Namen des C-Compilers enthält. Die $(...)
Syntax für Variablenerweiterungen in Makefiles wird immer dann verwendet, wenn eine Variable mit einem mehrstelligen Namen erweitert wird, da $CC
andernfalls auf den Wert der Variablen C
gefolgt von einem Literal erweitert würde C
( $CC
wäre im Grunde dasselbe wie $(C)C
in einem Makefile).
In der Shell gibt es jedoch aufgrund einer anderen Syntax $(CC)
eine Befehlsersetzung, die durch die Ausgabe der Ausführung des Befehls ersetzt wird CC
. Wenn auf Ihrem System kein solcher Befehl vorhanden ist, wird die Fehlermeldung „Befehl nicht gefunden“ angezeigt.
Es ist auch möglich, dass Sie sich verwechselt haben $(CC)
, ${CC}
was in der Shell unter den meisten Umständen gleichbedeutend ist mit $CC
. Die geschweiften Klammern sind nur erforderlich, wenn die Erweiterung der Variablen befolgt wirdsofortdurch eine andere Zeichenfolge, die andernfalls als Teil des Variablennamens interpretiert würde. Ein Beispiel für den Unterschied ist in "$CC_hello"
(erweitert die Variable mit dem Namen CC_hello
) und "${CC}_hello"
(erweitert die Variable CC
und hängt die Zeichenfolge _hello
an ihren Wert an) zu sehen. In allen anderen Fällen ${CC}
ist äquivalent zu $CC
. Beachten Sie, dass die Verwendung von geschweiften KlammernnichtZitieren der Erweiterung, d. h ${CC}
. istnichtdas Gleiche wie "$CC"
.
Wenn Sie eine Shell- oder Umgebungsvariable haben, die den Namen des Compilers enthält, den Sie zum Kompilieren von C-Code verwenden, und Sie diese Variable in der Befehlszeile verwenden möchten, verwenden Sie "$CC"
oder nur $CC
, wenn der Wert der Variablen keine Leerzeichen oder Shell-Globbing-Zeichen enthält.
$CC -o hello.elf hello.c
Antwort2
Die beiden sind nicht gleichwertig. In einer Zeile, die enthält $(foo)
, $(foo)
wird das durch die Ausgabe des Befehls ersetzt foo
. Beispiel:
$ echo "hello $(echo world)"
hello world
In einer Zeile, die enthält $foo
, $foo
wird durch den Wert der Variablen mit dem Namen ersetzt foo
. Beispiel:
$ foo=world
$ echo "hello $foo"
hello world
Antwort3
Diese Antwort berücksichtigt nicht die Makefile-Syntax.
"$(CC)"
ist die Ausgabe des Befehls CC
.
"$CC"
ist der Wert der Variablen CC
.
Damit dürfte der Unterschied klar sein:
$ CC=ls
$ echo $(CC)
CC: command not found
$ echo $CC
ls
Und
$ echo $($CC)
bin cdrom dev home initrd.img.old lost+found mnt proc run ...