Was ist der Unterschied zwischen $(CC) und $CC?

Was ist der Unterschied zwischen $(CC) und $CC?

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 $CCdas 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 $CCandernfalls auf den Wert der Variablen Cgefolgt von einem Literal erweitert würde C( $CCwäre im Grunde dasselbe wie $(C)Cin 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 CCund hängt die Zeichenfolge _helloan 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, $foowird 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 ...

verwandte Informationen