Problem mit Linker



  • Hallo,

    ich hab das erste mal versucht mein in Visual Studio entworfenes Projekt auch unter Linux zu compilieren.

    Habe dazu auch ein Makefile erstellt und wenn ich jetzt beginne das zu compilieren, dann bekomm ich folgenden Fehler:

    /usr/lib/gcc/i486-linux-gnu/4.1.3/../../../../lib/crt1.o: In function _start': (.text+0x18): undefined reference tomain'
    collect2: ld returned 1 exit status

    cc      = gcc
    
    cflags  = -ansi -Wall -pedantic -DLINUX #
    
    objects = error.o tbgrp.o
    
    .c.$(s):
            $(cc) $(cflags) $<
    
    error.o:        error.c error.h
                    $(cc) $(cflags) $<
    
    tbgrp.o:        tbgrp.c tbgrp.h
                    $(cc) $(cflags) $<
    
    team-builder:   $(objects)
                    $(cc) $(objects) -o team-builder
    

    so sieht mein makefile aus. hab ich da irgendwas falsch gemacht? kann jemand einen fehler erkennen?



  • Hi,

    wenn Du das "team-builder" target vor den beiden Object-targets nimmst, das seltsame ".c.$(s)" Target entfernst und bei den "cflags" vor dem Kommentar noch "-c" für nur kompilieren angibst sollte es gehen.



  • jetzt compiliert er mir die .o objekte aber dann hab ich den gleichen Fehler.

    Makefile

    cc      = gcc
    
    cflags  = -ansi -Wall -pedantic -c -DLINUX #
    
    objects = error.o tbgrp.o
    
    team-builder:   $(objects)
                    $(cc) $(objects) -o team-builder
    
    error.o:        error.c error.h
                    $(cc) $(cflags) $<
    
    tbgrp.o:        tbgrp.c tbgrp.h
                    $(cc) $(cflags) $<
    

    Fehler:

    gcc -ansi -Wall -pedantic -c -DLINUX error.c
    gcc -ansi -Wall -pedantic -c -DLINUX tbgrp.c
    gcc error.o tbgrp.o -o team-builder
    /usr/lib/gcc/i486-linux-gnu/4.1.3/../../../../lib/crt1.o: In function _start': (.text+0x18): undefined reference tomain'
    collect2: ld returned 1 exit status
    make: *** [team-builder] Fehler 1

    vielleicht noch n tipp? ich hab das -c mal vor die # gehängt, hilft aber auch nicht



  • Der linker findet keine main() funktion, bist du dir sicher, dass in einer deiner Sourcefiles eine int main() ist?



  • nur die team-builder.c hat eine main. wozu brauchen die anderen files die main()? da greife ich doch auf andere funktionen als die main zu.

    EDIT: kann es sein, dass ich die team-builder.c noch irgendwie in der Makefile berücksichtigen muss? Die enthält ja die main(). Wenn ja, wie muss ich die angeben?



  • bin einen Schritt weiter.

    hab jetzt dieses Makefile:

    cc      = gcc
    
    cflags  = -ansi -Wall -pedantic
    
    objects = team-builder.c error.c tblist.c tbio.c
    
    team-builder:   $(objects)
                    $(cc) $(objects) team-builder.c -o team-builder
    
    team-builder.o: team-builder.c
                    $(cc) $(cflags) $<
    
    error.o:        error.c error.h
                    $(cc) $(cflags) $<
    
    tblist.o:       tblist.c tblist.h error.h
                    $(cc) $(cflags) $<
    
    tbio.o:         tbio.c tbio.h tblist.h
                    $(cc) $(cflags) $<
    

    Dann bekomme ich aber den Fehler hier:

    /tmp/ccUxi4J3.o: In function checkarguments': team-builder.c:(.text+0x0): multiple definition ofcheckarguments'
    /tmp/ccUd0jIG.o:team-builder.c:(.text+0x0): first defined here
    /tmp/ccUxi4J3.o: In function run': team-builder.c:(.text+0x35): multiple definition ofrun'
    /tmp/ccUd0jIG.o:team-builder.c:(.text+0x35): first defined here
    /tmp/ccUxi4J3.o: In function main': team-builder.c:(.text+0x4b): multiple definition ofmain'
    /tmp/ccUd0jIG.o:team-builder.c:(.text+0x4b): first defined here
    collect2: ld returned 1 exit status
    make: *** [team-builder] Fehler 1

    wieso multiple? die sind doch nur einmal verlinkt oder nicht?

    EDIT: Komisch ich hab die tbgpr einfach nur umbenannt...

    EDIT2: Problem gelöst... der Link auf die team-builder.c muss weg beim linken der objectfiles...

    DANKE FÜR EURE HILFE, Dieses Forum ist mit seinen Membern einfach echt Spitzenklasse ^^



  • Also erstmal schreibst du das "-c" wieder in die "cflags". Dann machst du aus ".c" bei den Dateien in "objects" mal wieder ein ".o".
    Als letztes entfernst du "team-builder.c" aus Zeile 8.
    Wenn du nun alle C-Files berücksichtigt hast sollte es gehen.

    Gruß!


Anmelden zum Antworten