mikrocontroller.net

Forum: PC-Programmierung GCC zu viele Quelldateien


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Lothar (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich möchte ein grosses Projekt mit vielen Quelldateien kompilieren. Das 
geht nicht mit:

g++ file1.cc file2.cc file3.cc ...

weil scheinbar der Argument-String nicht beliebig lang sein darf. Wie 
kann man es sonst machen? Mit einem Linker-Skript?

Autor: Jemand (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Mit einem Build-System.

Autor: foobar (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau dir die @-Option an.

Aber "jemand" hat schon recht: wenn die Kommandozeile so lang wird, dass 
sie das System nicht mehr will (bei mir wären das ca 2MB), sollte man 
auf Make o.ä. wechseln.

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
2 lesenswert
nicht lesenswert
Lothar schrieb:
> weil scheinbar der Argument-String nicht beliebig lang sein darf. Wie
> kann man es sonst machen? Mit einem Linker-Skript?

Und dir sind dabei nie absurd lange Kompilier-Zeiten aufgefallen?
Also ich meine, du hast dich nie gewundert, dass du bei jeder winzigen 
Änderung in einer Quelldatei wieder recht lange kompilierst?

Autor: A. S. (achs)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sven P. schrieb:
> Und dir sind dabei nie absurd lange Kompilier-Zeiten aufgefallen?

Das sind bei Windows nur 2 oder 8 tausend Zeichen, also je nach Pfaden 
und Optionen nur ein paar Dutzend quell-Dateien. Das fällt einem 
Anfänger nicht wirklich auf. Zumal dann jede Datei nur 10 Funktionen a 
10 Zeilen hat.

Autor: Tilo R. (joey5337) Benutzerseite
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Das scheint ein guter Zeitpunkt zu sein, sich mit make zu beschäftigen.

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lothar schrieb:
> Ich möchte ein grosses Projekt mit vielen Quelldateien kompilieren. Das
> geht nicht mit:
>
> g++ file1.cc file2.cc file3.cc ...
>
> weil scheinbar der Argument-String nicht beliebig lang sein darf.

Genau, denn du verwendest offenbar MS Windows.

> Wie kann man es sonst machen?

Linux verwenden oder mit @-Datei versuchen, in welche du die 
Kommandozeilenargumente schreibst.

http://gcc.gnu.org/onlinedocs/gcc/Overall-Options.html

Das hilft aber nur bis dahin, wo der Compiler(treiber) wieder eine 
Kommandozeile für nen Subprozess zusammenbastelt, etwa für den Linker: 
Der muss ja alle Object-Dateien bekommen.

Wenn GCC mit einem @-File aufgerufen wurde, dann erstellt er auch ein 
@-File, um die Argumente an den Linker zu übergeben — falls der 
GNU-Linker verwendet wird und GCC dies beim configure bekannt ist: 
configure ... --with-gnu-ld ...

Oder eine statische Lib erstellen, die die Module enthält, und gegen 
diese linken.


 Mit einem Linker-Skript?

Autor: mh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Johann L. schrieb:
> Oder eine statische Lib erstellen, die die Module enthält, und gegen
> diese linken.

Hat man dabei nicht evtl. das gleiche Problem?

Autor: Lothar (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Johann L. schrieb:
> du verwendest offenbar MS Windows

Nein ist auf Pi mit RISC OS. Inzwischen habe ich aber eine "Lösung" ...

Alles ausser main.cc unter Linux mit GCC Cross-Compiler für ARM in eine 
statische Library packen und auf Pi mit RISC OS dann nur noch:

g++ lib.a main.cc

> Kommandozeile für nen Subprozess zusammenbastelt

Das war wohl genau das Problem.

Sven P. schrieb:
> absurd lange Kompilier-Zeiten

Der RISC OS Port vom GCC ist schon bei einer Quelldatei lahm und wird 
dann nicht mehr viel lahmer. Es soll aber Abhilfe in Arbeit sein :-)

http://riscosblog.huber-net.de/2019/10/erste-anzeichen-fuer-gcc-8-2-0/

Beitrag #6032399 wurde von einem Moderator gelöscht.
Autor: S. R. (svenska)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lothar schrieb:
> Wie kann man es sonst machen?

Mir getrennten Aufrufen... so wie jedes gebrauchbare Build-System auch.

Lothar schrieb:
> g++ file1.cc file2.cc file3.cc ...
g++ -c -o file1.o file1.cc
g++ -c -o file2.o file2.cc
...
g++ -o prog file1.o file2.o ...

Die letzte Zeile dürfte bei vielen Dateien auch ein bisschen kürzer sein 
als dein Ausgangsbeispiel.

Unter aktuellen Betriebssystemen sind die Grenzen aber hinreichend groß, 
dass man sich meist nicht mit Parameterdateien behelfen muss (bei DOS 
lag die Grenze bei 127 Bytes über alles, da waren @-Dateien spätestens 
beim Linken normal).

: Bearbeitet durch User
Autor: Heiko L. (zer0)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
S. R. schrieb:
> Mir getrennten Aufrufen... so wie jedes gebrauchbare Build-System auch.

Problem dürfte da aber bleiben, dass auch die Linker-Zeile viel zu lang 
werden wird.

Fazit: So ein Projekt muss man sinnvoll aufteilen.

Autor: Jemand (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Heiko L. schrieb:
> S. R. schrieb:
>> Mir getrennten Aufrufen... so wie jedes gebrauchbare Build-System auch.
>
> Problem dürfte da aber bleiben, dass auch die Linker-Zeile viel zu lang
> werden wird.

Dann Linkt man in mehreren Schritten, so wie jedes brauchbare 
Buildsystem es kann. Hilft auch mit der Parallelisierung.

Autor: Rolf M. (rmagnus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mh schrieb:
> Johann L. schrieb:
>> Oder eine statische Lib erstellen, die die Module enthält, und gegen
>> diese linken.
>
> Hat man dabei nicht evtl. das gleiche Problem?

Man muss ja nicht das gesamte Programm in eine einzige Lib stecken. Eine 
statische Lib ist nicht mehr als ein Archiv, das mehrere Object-Files 
enthält. Ich packe also zusammengehörende Object-Files in ein Archiv und 
muss sie dann nachher dem Linker nicht mehr alle einzeln angeben, 
sondern einfach das komplette Archiv auf einmal.

Autor: Olaf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Nein ist auf Pi mit RISC OS. Inzwischen habe ich aber eine "Lösung" ...

Interessant. Kannst du mal ein bisschen mehr darueber erzaehlen? (gerne 
mit eigenem Subject)

Ich  finde RISCO OS naemlich grundsaetzlich auch sehr interessant, aber 
habe den Eindruck das es halt eher so die Nische von alten Englaendern 
bedient die sich mit Wehmut an ihren Archimedes erinnern. Wuerdest du 
sagen das dies ein lebendiges Betriebsystem ist mit dem sich die 
Beschaeftigung lohnt?
Gibt es eine lebendige Communitiy?

Ich vermute mal RISC OS auf dem neuen PI4 koennte ziemlich atemberaubend 
sein oder?

Olaf

Autor: Lothar (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Olaf schrieb:
> Gibt es eine lebendige Communitiy?

https://www.riscosopen.org/forum/

> RISC OS auf dem neuen PI4

Ich nutze RISC OS hauptsächlich für Pi Zero und Pi 1A+ um die als 
"dicke" Mikrocontroller zu nutzen. Der Desktop ist aber auch schon auf 
dem Pi 1A+ sehr schnell so dass man auf einem Pi 3B+ den Unterschied 
nicht so merkt. Ausser bei Grafik-Benchmarks. Der Pi 4 wäre trotzdem 
interessant wegen den zwei HDMI-Ports. Nachdem die Foundation RISC OS zu 
Anfang noch sehr unterstützt hat:

https://www.raspberrypi.org/blog/risc-os-for-raspberry-pi/

Hat das aber inzwischen stark nachgelassen so dass alles mühsam von 
Raspbian portiert werden muss. Ist also noch nicht fertig:

https://gitlab.riscosopen.org/RiscOS/Sources/HAL/HAL_BCM2835/merge_requests/2

RISC OS läuft übrigens auch auf teuren Industrie-Boards z.B.

http://www.ti.com/tool/ELESAR-3P-SITARA-SOMS
https://revolution.kunbus.de/
https://www.wandboard.org/

Und auf ARM Laptops:

https://www.pine64.org/pinebook/

Autor: Peter D. (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich kannte auch mal einen Kollegen, der hat als Verzeichnisnamen ganze 
Romane geschrieben. Damit hat er alle anderen regelmäßig zur 
Verzweiflung getrieben.
Da hilft dann, das aktuelle Projekt in ein Verzeichnis in der Root zu 
kopieren oder per subst zu linken.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.