Chcę wiedzieć jak zamiast biegać

gcc -std=c99 foo.c -o foo -lcs50

Mogę po prostu biec

make foo

Problem polega na tym, że kiedy próbuję tego za pomocą tylko polecenia make, jest napisane

cc     foo.c   -o foo
Undefined symbols for architecture x86_64:
  "_GetString", referenced from:
      _main in crypto-6PNyQP.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [crypto] Error 1

Ale kiedy dołączam inne flagi do polecenia gcc, działa dobrze. Biorę lekcję online i oni są w stanie po prostu wpisać make foo, a ich wynik będzie

jharvard@appliance (~/Desktop): make foo
gcc -ggdb -std=c99 -Wall -Werror    foo.c  -lcrypt -lcs50 -lm -o foo
jharvard@appliance (~/Desktop):

Od jakiegoś czasu szukam w Google, próbując znaleźć odpowiedź na to pytanie, ale wciąż nie mam szczęścia.

c
1
Yamaha32088 21 październik 2012, 01:33

2 odpowiedzi

Najlepsza odpowiedź

Korzystanie z GNU make:

make CFLAGS=-std=c99 LDLIBS=-lcs50 foo

Lub umieść te makra w 2-wierszowym makefile:

CFLAGS = -std=c99
LDLIBS = -lcs50

Dla bardziej złożonych opcji pokazanych w ostatnim przykładzie:

CFLAGS = -ggdb -std=c99 -Wall -Werror
LDLIBS = -lcrypt -lcs50 -lm

Z makefile takim jak ten, możesz zbudować dowolny program xyz z jednego pliku źródłowego xyz.c używając tylko:

make xyz

Kiedy musisz tworzyć programy z wielu plików źródłowych, potrzebujesz bardziej złożonego makefile.

2
Jonathan Leffler 21 październik 2012, 02:39

Istnieje forum dyskusyjne (do którego można dołączać za pośrednictwem grup google), które specjalizuje się w odpowiadaniu na pytania dotyczące konfiguracji urządzenia CS50, które, jak zakładam, prowadzisz od czasu korzystania z Harvard's CS50 online.

CS50 in a Box (urządzenie) należy skonfigurować tak, aby po wpisaniu make, podczas kilku pierwszych zadań domowych działo się „właściwa” rzecz, abyś nie musiał od razu martwić się o szczegóły kompilacji.

Jeśli jednak wydaje się, że to nie działa, możesz wysłać pytanie do grupy, o której wspomniałem powyżej, "cs50-discuss". Jeśli (niezalecanie) używasz własnej konfiguracji zamiast modułu, możesz po prostu wyszukać, jak utworzyć „Makefile”, plik tekstowy, który jest odczytywany przez program „make” po jego uruchomieniu. Posiadanie pliku Makefile pozwoli Ci upewnić się, że polecenie, które chcesz uruchomić, zostanie poprawnie wywołane, gdy wywołasz 'make'.

0
brunobeltran0 21 październik 2012, 02:28