Hello, Guest the thread was called147 times and contains 3 replays

last post from silverdr at the

cl65 Befehl zum Library dazulinken funktioniert nicht wie er soll

  • Bibliotheken sind eine tolle Methode um Funktionen nur dann dazuzulinken, wenn sie auch verwendet werden. Erstellung und Verwendung werden von der cc65-Suite unterstützt.

    Beim Befehl cl65 ist das Verhalten beim Linken der Library aber komisch.


    Ich habe testweise eine Funktion in einer Datei hallo.s erstellt:


    Code
    1. .export printhallo
    2. printhallo: lda #<text
    3. ldy #>text
    4. jmp $AB1E
    5. text: .byte "hallo",0


    und eine Datei main.s die die Funktion printhallo über eine Library nutzen soll:


    Code
    1. .import printhallo
    2. jmp printhallo


    Jetzt könnte ich natürlich das ganze mit cl65 main.s hallo.s -C c64-asm.cfg -u __EXEHDR__ -o main.prg zusammenbauen, das funktioniert auch. Aber es soll ja eine Library sein, da vielleicht noch andere Funktionnen dazukommen:


    daher Objectfile erzeugen:

    ca65 -t c64 hallo.s


    und in eine Library einfügen:

    ar65 a mylib.lib hallo.o


    Wir haben jetzt eine Library mylib.lib (wenngleich nur mit einem Objektfile, fürs Testen egal)


    main.s kann nun unter Zuhilfename der Library assembliert werden, dass sollte mit der Option --lib libfile gehen.


    Bei den folgenden Befehlen wird die Library aber nicht dazugelinkt, der Linker bricht mit einer Fehlermedlung "unresolved external(s) found - cannot create output file" ab:


    cl65 --lib mylib.lib -C c64-asm.cfg -u __EXEHDR__ main.s -o main.prg

    cl65 main.s --lib mylib.lib -C c64-asm.cfg -u __EXEHDR__ -o main.prg


    Diese Variante bricht ebenfalls mit dieser Fehlermeldung ab und erzeugt eine Datei namens "ib". Das ist nicht ganz überraschend, da die Option -l ein Labelfile erzeugt und -lib als -l ib interpretiert wird:

    cl65 -lib mylib.lib -C c64-asm.cfg -u __EXEHDR__ -o main.prg main.s


    Einzig diese Variante funktioniert und erzeugt ein lauffähiges Programm:


    cl65 main.s -lib mylib.lib -C c64-asm.cfg -u __EXEHDR__ -o main.prg


    Meine Fragen:


    1. Warum gehen die beiden ersten Varianten des cl65-Befehls nicht?


    2. Warum geht die letzte Variante? Laut Usage ist die Syntax zum Dazulinken einer Libraries "--lib file", nicht "-lib"


    Ich habe die Version cl65 V2.18 - Git 1074d35 verwendet.


    P.S.: mir ist gerade aufgefallen dass das eigentlich in das Unterforum Cross Development gehört, aber ich kann den Beitrag leider weder löschen noch verschieben, sorry. Falls es jemand verschieben kann, bitte - danke!

  • Soweit ich erinnern kann - Libs können ohne "Option" hinzugefügt werden. Du kannst einfach:

    Code
    1. $ cl65 main.s mylib.lib -C c64-asm.cfg -u __EXEHDR__

    nutzen. Warum die Option nicht (mehr?) funzt muss ich aber nachfragen.

    Ah, das erklärt einiges, danke. Ich hab noch ein bisschen experimentiert und herausgefunden dass es funktioniert solange mylib.lib irgendwo hinter main.s in den Argumenten auftaucht.


    Was noch interessant ist: -lib erzeugt in diesen Fällen kein Labelfile namens ib


    Danke für die Info, falls du noch mehr in Erfahrung bringen kannst wäre ich sehr interessiert.

  • cl65 -lib mylib.lib -C c64-asm.cfg -u __EXEHDR__ -o main.prg main.s


    Was noch interessant ist: -lib erzeugt in diesen Fällen kein Labelfile namens ib

    Das versteht cl65 als "versuche mal listing für mylib.lib zu erzeugen als Datei ib". Weil mylib.lib ist nicht mehr assembliert. Listing kommt als leer/null und is einfach ignoriert. Meiner Meinung nach es wäre besser eine Warnung auszugeben in solchen Fallen.