Formatul fișierului nu este recunoscut; se tratează ca script de linker folosind GCC (Programare, Gcc, Linker, Makefile, Compilare)

user695978 a intrebat.

Sunt destul de nou la Makefiles și încerc să construiesc un executabil din 3 fișiere, file1.c, file2.c și file1.h într-un executabil numit exFile. Iată ce am obținut:

all: exFile
exFile: file1.o file2.o 
    gcc -Wall -g -m32 repeat.o show.o -o repeat

file1.o: file1.c file1.h
    gcc -Wall -g -m32 -S file1.c -o file1.o

file2.o: file2.c 
    gcc -Wall -g -m32 -S file2.c -o file2.o

Am căutat pe web pentru makefiles în acest format, dar am venit cu mâinile goale, așa că mă întrebam dacă cineva mă poate ajuta. Când încearcă să compileze primesc:

usr/bin/ld:file1.o:1: file format not recognized; treating as linker script

Am compilat programe folosind fișiere de asamblare, dar nu sunt sigur ce să fac cu fișierele c sau cu fișierul file1.h. file1.c include file1.h, așa că trebuie să le leg (cred?). Orice sugestii sau linkuri către o referință ar fi apreciate

2 răspunsuri
Eric Melski

Aveți două probleme cu dvs. gcc linie de comandă. În primul rând, specificați -S care face ca gcc să emită cod de asamblare, mai degrabă decât cod obiect. În al doilea rând, vă lipsește instrucțiunea -c care îi spune lui gcc să compileze fișierul într-un fișier obiect, dar nu să îl lege. Dacă eliminați pur și simplu -S și nu schimbați nimic altceva, veți obține un program executabil numit file1.o și un altul numit file2.o, în loc de două fișiere obiect.

În afară de aceste erori, ați putea simplifica fișierul makefile prin utilizarea regulilor de tipare. Vă sugerez să încercați în schimb următoarele:

all: exFile
exFile: file1.o file2.o 
    gcc -Wall -g -m32 $^ -o [email protected]

%.o: %.c
    gcc -Wall -g -m32 -c $< -o [email protected]

file1.o: file1.h

Sau, așa cum arată EmployedRussian, puteți opta pentru ceva și mai minimalist care să valorifice mai multe dintre caracteristicile încorporate ale GNU make:

CC=gcc
CFLAGS=-Wall -g -m32

all: exFile

exFile: file1.o file2.o 
        $(LINK.c) $^ -o [email protected]

file1.o: file1.h

Comentarii

  • Acest makefile este încă destul de prost. Nu aveți nevoie de o regulă de model – make are una la fel ca aceasta deja încorporată. De asemenea, exFile va fi întotdeauna neactualizat, deoarece construiți „repeat” în locul lui. Dacă oferiți un exemplu de corectare a fișierului makefile, vă rugăm să faceți o treabă mai bună! –  > Por Angajat rus.
  • @Employed Russian: oops, mulțumesc pentru că ați prins acea greșeală de scriere (copiată din OP). În ceea ce privește simplificarea makefile-ului, da, ar putea fi mai simplu, dar nu sunt sigur că făcând acest lucru ar ajuta la înțelegerea OP-ului, având în vedere că nu structura makefile-ului a fost cea care a cauzat probleme. –  > Por Eric Melski.
mu este prea scurt

-S switch la gcc îi spune să emită asamblorul de ieșire astfel încât acesta:

gcc -Wall -g -m32 -S file1.c -o file1.o

Este de a pune asamblor în file1.o dar tu vrei, probabil, să compilezi file1.c în cod obiect:

gcc -Wall -g -m32 file1.c -o file1.o

Când linkerul primește file1.o este confuz deoarece file1.o este asamblor când linkerul se așteaptă la cod obiect, de unde și eroarea dumneavoastră.

Prin urmare, eliminați -S pentru file1.o și file2.o.

Comentarii

  • Mulțumesc pentru răspuns, dar tot nu am avut noroc… primesc aceeași eroare. Im total stumped pe acest lucru. Voi cerceta mai mult știu că nu sunt atât de departe, probabil doar un detaliu pe care l-am trecut cu vederea. –  > Por utilizator695978.
  • @user69595978: Ce se întâmplă dacă file file1.o pentru a obține tipul de fișier? –  > Por mu este prea scurt.