c + automake anfängerfrage



  • Hallo,

    ich versuche zum ersten mal via automake die glib zu nutzen, leider wird diese nicht gefunden. Diese ist jedoch installiert.

    der Aufruf von Make produziert:

    gcc -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include    -g -O2 -lglib-2.0     -o testsocket clients.o client.o
    

    dies bricht mit diesem Fehler ab:

    clients.o: In function `testClientsNew':
    /home/dev/proj/c/socket/src/clients.c:46: undefined reference to `g_assertion_message_expr'
    /home/dev/proj/c/socket/src/clients.c:47: undefined reference to `g_assertion_message_expr'
    clients.o: In function `main':
    /home/dev/proj/c/socket/src/clients.c:51: undefined reference to `g_test_init'
    /home/dev/proj/c/socket/src/clients.c:52: undefined reference to `g_test_add_func'
    /home/dev/proj/c/socket/src/clients.c:54: undefined reference to `g_test_run'
    collect2: error: ld returned 1 exit status
    

    dies jedoch geht ohne probleme

    cc clients.c client.c client.h `pkg-config --cflags --libs glib-2.0` -o hello
    

    ich verstehe nicht, warum es mit automake nicht läuft. hoffe mich kann jemand aufklären 🙂


  • Mod

    Die Reihenfolge hat eine Bedeutung. Gelinkt wird von links nach rechts. Das hat nichts mit automake zu tun, sondern ist eine Eigenschaft des GNU-Linkers. Das ist auch keine böse Absicht, irgendeine Reihenfolge muss es schließlich geben und bei diesem Linker wird die Reihenfolge eben wie beschrieben gehandhabt.



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C (C89, C99 und C11) in das Forum Compiler- und IDE-Forum verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Danke für die schnelle Antwort!

    sollte nicht aber die Reihenfolge stimmen wenn ich diese nicht explizit mit angebe?

    meine Makefile.am sieht wie folgt aus:

    # what flags you want to pass to the C compiler & linker
    AM_CFLAGS = $(DEPS_CFLAGS)     
    AM_LDFLAGS = $(DEPS_LIBS)      
    
    # this lists the binaries to produce, the (non-PHONY, binary) targets in
    # the previous manual Makefile 
    bin_PROGRAMS = testsocket      
    testsocket_SOURCES = clients.c client.c client.h
    


  • Muss es denn wirklich eine Reihenfolge geben?
    Ich hätte mir das jetzt so vorgestellt, dass der Linker erstmal einen Pool von Symboldefinitionen aufbauen kann und anschließend ans Werk geht, könnte sogar noch die Reihenfolgen abspeichern und die Symbole bei Mehrfachauftreten (soll es ja aber eigentlich nicht geben dürfen -> ODR) entsprechend der Reihenfolge vor der Referenzierenden Definition zuordnen.



  • SeppJ schrieb:

    Das hat nichts mit automake zu tun, sondern ist eine Eigenschaft des GNU-Linkers

    bei diesem Linker wird die Reihenfolge eben wie beschrieben gehandhabt.

    Arbeiten nicht alle Unix-Linker auf diese Weise? Ich weiß, das widerspricht nicht deiner Aussage, ich wundere mich nur, weshalb du den GNU ld hier so hervorhebst.


  • Mod

    Weil ich mir nicht sicher war, ob das wirklich für alle gilt. Daher habe ich die eingeschränktere Aussage gemacht, weil ich genau weiß, wie viele Klugscheißer auf solch eine Aussage anspringen würden 🙂 .


Anmelden zum Antworten