2017-07-10 5 views
1

Ich versuche meinen Code zu kompilieren, aber es funktioniert nicht. Ich habe das in der Schule kompilieren lassen, aber ich kann das nicht auf meinem Heimcomputer kompilieren. Ich kann nicht herausfinden, warum. Ich brauche diesen Fehler behoben, um meine Aufgabe fortzusetzen. Auch Diese list.o-Datei ist die Profs-Datei. Ich muss diese Datei verwenden. Ich bin ein Anfänger bei der Verwaltung meiner Linux. Bitte nimm mich mit.GCC Verknüpfung mit .o Datei

Lösungen Ich habe es irgendwie versucht? Ich habe gcc auf gcc-7 aktualisiert. Ich habe gelegen libc.a

/usr/lib/x86_64-linux-gnu/libc.a 
/usr/share/doc/libklibc/README.klibc.arch 

Edit: Ich habe versucht, ohne -fPIC Kompilieren

gcc -m64 -pthread -Wall -std=c99 -o run main.o as2.o list.o 
/usr/bin/ld: list.o: relocation R_X86_64_32S against undefined symbol... 

Das vom Terminal ist: `

gcc -m64 -pthread -Wall -std=c99 -fPIC -o run main.o as2.o list.o 
/usr/bin/ld: list.o: relocation R_X86_64_32S against undefined symbol `headlist' can not be used when making a shared object; recompile with -fPIC 
/usr/bin/ld: final link failed: Nonrepresentable section on output 
collect2: error: ld returned 1 exit status 

`

Das ist meine Make-Datei: `

CC = gcc 
CFLAGS = -m64 -pthread -Wall -std=c99 -fPIC 
PROG = run 
OBJS = main.o as2.o list.o 

run: $(OBJS) 
    $(CC) $(CFLAGS) -o $(PROG) $(OBJS) 

main.o: main.c list.h as2.h 
    $(CC) $(CFLAGS) -c main.c 

as2.o: as2.c as2.h list.h 
    $(CC) $(CFLAGS) -c as2.c 

clean: 
    rm main.o as2.o run 

`

Das ist mein beinhaltet: `

#include <netinet/in.h> 
    #include <sys/socket.h> 
    #include <netdb.h> 
    #include <unistd.h> 
    #include <stdio.h> 
    #include <stdlib.h> 
    #include <string.h> 
    #include <pthread.h> 
    #include "list.h" 
    #include "as2.h" 

`

Irgendwelche Ideen/Lösungen? Vielen Dank!

+0

Meine Vermutung ist, dass 'list.o' ist kompiliert ohne' -fPIC' und Mischen von Objekten mit und ohne dieses Flag ist keine gute Idee. Versuchen Sie, _without_ diese Flagge neu zu kompilieren. – rodrigo

+0

@rodrigo Danke für die Antwort! Ich habe vergessen zu erwähnen, dass ich vorher auch ohne -fPIC kompiliert habe. Es würde immer noch nicht funktionieren. gcc -m64 -pthread -Wall -std = c99 -o laufen main.o as2.o list.o /usr/bin/ld: list.o: Umzug R_X86_64_32S gegen undefinierte symbo – elam

+0

Mmmm, die Zeile, die Sie in der editieren kompiliert nichts, es ist verlinken. Sie können versuchen, alle Ihre Dateien zu kompilieren und zu verknüpfen, ohne '-fPIC', nur für den Fall ... – rodrigo

Antwort

-1

EDIT: änderte die Schreibweise von LFLAGS zu LDFLAGS, um einige Kommentare zu beschwichtigen.

EDIT: verschoben die -c Option, um einige Kommentare zu beschwichtigen.

Hinweis: all ist normalerweise das erste Ziel in einer Make-Datei.

Hinweis: := statt = verwendet, so dass die Makros nur einmal ausgewertet werden.

Hinweis: Die list.o ist bereits im aktuellen Verzeichnis verfügbar (nach der OPs-Frage) und wird nicht im Makefile kompiliert. Aber ist nur mit den anderen Objektdateien verknüpft, um die ausführbare Datei zu erzeugen

Ihr Makefile scheint ein paar Versehen zu haben. Vorschlagen:

CC := gcc 
RM := rm -f 

CFLAGS := -ggdb -m64 -pthread -Wall -Wextra -pedantic -std=c99 
#LDFLAGS := <-- use the default value 

PROG := run 
OBJS := main.o as2.o list.o 
HDRS := list.h as2.h 



.PSEUDO: all clean 

all: $(PROG) 

$(PROG): $(OBJS) 
    $(CC) -ggdb -o $(PROG) $(OBJS) $(LDFLAGS) 

main.o: main.c $(HDRS) 
    $(CC) $(CFLAGS) -c main.c -o main.o -I. 

as2.o: as2.c $(HDRS) 
    $(CC) $(CFLAGS) -c as2.c -o as2.o -I. 

clean: 
    $(RM) main.o as2.o run 
+0

Setzen Sie '-c' nicht in' CFLAGS', es beschränkt die Verwendung. Wollen Sie auch einem Anfänger nicht erklären, was Sie geändert haben und warum? –

+0

IMO: Setzen Sie das Flag -c in CFLAGS, warum, denn das Übersetzen ist das einzige Mal, dass CFLAGS jemals erwähnt werden sollte. Zum Verknüpfen gibt es die LFLAGS (die in der Nähe des Endes der Link-Befehlszeile platziert werden sollte) – user3629249

+0

hey user362949, was ist -ggdb, -m64, -Wextra, -pendantique, -I. ? Wie werden mir diese in meinem Fall helfen? – elam

Verwandte Themen