Hallo zusammen, ich habe ein Problem und weis momentan nicht wie ich es richtig angehen soll. Es geht um den Linkeraufruf meiner Projekte. Bisher bin ich immer gut klargekommen. Setup: Windows. Linux ist leider keine Option. Eclipse GNU ARM Toolchain Platformen sind unterschiedliche STM32-Cortex Derivate Das Kernproblem ist nicht mein Projekt sondern Windows. Eclipse ruft die Buildtools per Kommandozeilenbefehl auf. Zunächst habe ich die Grenze von 81xx Zeichen als Übergabeparameter erreicht. Damals lief alles über den internen CDT Build. Damals habe ich dann die unten beschriebenen Buildtools verwendet und somit zunächst mein Problem behoben. https://mcuoneclipse.com/2015/03/29/solving-the-8192-character-command-line-limit-on-windows/ Was ich damals nicht wusste, ist das Windows aus irgendwelchen Gründen ein absolutes Call Limit für jedwelche Aufrufe hat (100% bin ich mir nicht sicher). Bei 31k Zeichen geht auf jeden fall garnichts mehr. :-( Eclipse ruft den linker jetzt zwar über die Buildtools auf aber übergibt nach wie vor alle Objektfiles zusammen als einzelnen Parameter. Aufgrund von Windows ist daher bei ca. 31k Zeichen tutti. Es kommt zum Programmfehler und der Linkprozess schlägt fehl. Es gibt jetzt mehrere Möglichkeiten um das Problem zu lösen. Wie gesagt, Linux ist nicht möglich. 1. Vielleicht muss muss ich mich jetzt intensiv mit Makefiles beschäftigen. Ich finde das Thema aber ziemlich öde und muss sagen, dass ich es echt angenehm fand, dass eclipse mir das abnimmt. Da wird ja ein makefile generiert und anhand dessen der erstellt. 2. Ein Problem dabei ist sicherlich auch, dass die Ordnerhirachie beim erstellen der Objectfiles genau gleich ist wie beim Projekt und sich deshalb die Aufrufe verlängern (Die Pfade werden aus dem Root zusammengebaut). Vielleicht bekomme ich es hin, dass alle Objects in einen Ordner geschmissen werden...? Was ich auf keinen Fall möchte, ist jedes mal wenn das Projekt wächst irgendwas hinzufügen... Kennt jemand für Make eine gute Hilfe Buch Tips wie ich das Thema am schnellsten reinbekomme? Vielleicht gibts auch Tools die von Eclpise unterstützt werden? 3. Ich könnte große Module in Libs packen. Aber auch da komme ich an die Grenzen z.B. wenn ich externe Grafikbibliotheken einbinden will.. Gibt es vielleicht noch andere Möglichkeiten? Wie löst ihr dieses Problem unter Windows? Vielen Dank für eure Anregungen. Falls noch Infos fehlen kann ich die Gerne noch nachreichen... Grüße EL
Man kann die zu linkenden Object Files auch per Linkerscript übergeben. Das könntest du dann automatisch aus den vorhandenen Sourcefiles generieren...
EL schrieb: > 2. Ein Problem dabei ist sicherlich auch, dass die Ordnerhirachie beim > erstellen der Objectfiles genau gleich ist wie > beim Projekt und sich deshalb die Aufrufe verlängern (Die Pfade werden > aus dem Root zusammengebaut). kannst du sie nicht relativ zum makefile angeben? Wenn die anfangs Hierarchie überall gleich ist, könnte man auch für den Ordner einen Laufwerksbuchstaben vergeben.
Hallo Dr. Sommer, wie gehe ich das an? Nicht immer alle Sourcefiles in Eclpise warden compiliert. z.B. bei FreeRTOS sind unterschiedliche Memorymodelle im Projekt. Ich habe die die ich nicht brauche einfach vom build ausgeschlossen. Sie sind aber nach wie vor mit im Projekt. Wie sieht so ein Linkerscript aus? Wie erstelle ich es? Grüße EL
Hi Peter, Die Dateinamen sind relative zum Makefile. Aber die Hirachie wächst dann auch über 2-3 Ordner. Die Summe macht das Problem. Wir sprechen von einigen Hundert Source dateien. Was meinst du mit Laufwerksbuchstaben? Grüße El
ld kann die Parameter aus einer Datei lesen @file Read command-line options from file. The options read are inserted in place of the original @file option. If file does not exist, or cannot be read, then the option will be treated literally, and not removed. damit sollte es doch einfach gehen.
Andere Möglichkeit: Objects in ein Archive packen (mit ar), dann muss zum Linken nur der Archiv Name auf der Kommandozeile stehen.
EL schrieb: > Die Dateinamen sind relative zum Makefile. Aber die Hirachie wächst dann > auch über 2-3 Ordner. Die Summe macht das Problem. Wir sprechen von > einigen Hundert Source dateien. ok, dann bringt das nichts > Was meinst du mit Laufwerksbuchstaben? man kann ein virtuelles Laufwerk mit subst anlegen, was in ein Verzeichnis zeigt. Damit könnte man etwas sparen, aber du arbeitest ja schon relativ da bringt das nichts. Wie schon geschrieben, kann der ld seine Parameter auch aus einer Datei lesen. Die Obj in eine Datei zu scheiben sollte doch recht einfach sein.
Hallo Peter, ich denke das werde ich probieren. Wenn ich dich richtig verstehe muss ich alle Objectfiles inkl. relativem Pfad dran, zeilenweise in eine Datei packen. Ich baue mir also eine Objectlist. Diese File wird dann an den Linker mit @file übergeben? Ist das so korrekt? Liest der Linker das dann Zeilenweise?! Ich hoffe ich komme möglichst schnell an die ganzen *.o
EL schrieb: > Ist das so korrekt? Liest der Linker das dann Zeilenweise?! schau doch einfach mal in die Doku: folgendes steht drin: Options in file are separated by whitespace. A whitespace character may be included in an option by surrounding the entire option in either single or double quotes. Any character (including a backslash) may be included by prefixing the character to be included with a backslash. The file may itself contain additional @file options; any such options will be processed recursively.
Peter II, ich denke das ist der richtige Ansatz um das Problem zu lösen. Danke schonmal dafür Ich muss jetzt erstmal vor dem Linkprozess dieses Objectlistfile erstellen.. :-)
Hallo Leute, ich habe jetzt eine erste funktionierende Version erstellt. Danke nochmal an Peter. Ich will euch nicht vorenthalten wie ich es realisiert habe. Allerdings halt ich es in meinem Fall nur für einen Workaround. Warum erzähle ich euch sofort. Wie in einem voherigen Post schon erwähnt, generiert Eclipse automatisch ein Makefile. Das ist toll, den diese arbeit bleibt dann nicht an mir hängen :-). Soweit so gut. Ich bin jetzt volgendermaßen vorgegangen. Zunächst habe ich mir ein Makefile generieren lassen. Dann habe ich die generierung deaktiviert damit ich während des Buildprozesses eine Liste meiner Objekte anfertigen kann. Vor dem Linken habe ich mir so mit Hilfe der makesyntax eine Datei erstellt in der alle Objpfade abgelegt sind. $(file > OBJLIST.txt, $(OBJS)) Im ld aufruf warden diese dann einfach mit @file(@OBJLIST.txt) übergeben. Funktioniert wunderbar. Ihr ahnt jetzt sicher was das Problem ist. Wenn ich weiterhin Makefiles generieren lassen möchte, warden meine extra einträge natürlich überschrieben. Komme ich irgendwie an das Template für die Generierung ran? Dann könnte ich meine extras beliebig hinzufügen. Danke für die Infos mfg EL
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.