Kann man Objektfiles, die mit unterschiedlichen Compilern von gcc compiliert wurden, mischen?



  • Wenn ich also 3 Quelldateien in C habe, z.B.
    aa.c
    bb.c
    cc.c

    Und davon Ojektdateien mit verschiedenen Versionen von GCC anlege:
    aa.o -> GCC Vers. 3.3
    bb.o -> GCC Vers. 4.2
    cc.o -> GCC Vers. 4.4

    Können diese 3 Objektdateien dann zu einem einzigen Programm noch gelinkt werden?

    Wenn ja, wie würde es aussehen, wenn man auch den Compiler abwechselnd ändert?
    Z.B. einmal GCC, dann den C Compiler von Intel oder den C Compiler des LLVM Projekts.

    Prinzipiell geht es mir darum, daß ich nur die Objektdateien vom Quellcode veröffentlichen möchte, aber es kann ja vorkommen, daß die Personen, die diese Downloaden, dann unter verschiedenen Linuxdistributionen diese zu einem Programm linken wollen und das sollte dann natürlich auch noch dann funktionieren, wenn z.B. die verwendete Compilerversion von Distribution zu Distribution abweicht. Das gleiche gilt auch für eventuelle C Bibliotheken wie z.b. auch der C Standardlibrary.



  • BTW:
    Nur aus reiner Neugierde, würde das ganze Vorhaben auch bei C++ Code gehen?



  • Wie es mit unterschiedlichen GCC Versionen aussieht weiß ich nicht, aber mit unterschiedlichen Conpilern geht's leider nicht.


  • Mod

    cooky451 schrieb:

    Wie es mit unterschiedlichen GCC Versionen aussieht weiß ich nicht, aber mit unterschiedlichen Conpilern geht's leider nicht.

    Wie kommst du da drauf? Eigentlich sollte das gehen. Auch mit verschiedenen Compilern.


  • Mod

    Objektcode veröffentliche schrieb:

    BTW:
    Nur aus reiner Neugierde, würde das ganze Vorhaben auch bei C++ Code gehen?

    Nein. Bestenfalls mit verschiedenen Versionen des gleichen Compilers könntest du Glück haben, ist aber nicht festgelegt.

    edit: Es gibt aber einen "inoffiziellen" Standard für C++. Wenn deine Compiler sich beide da dran halten, geht es auch. Wer sich natürlich wieder mal nicht da dran hält ist meines Wissens nach Microsoft, da sind die Objektdateien noch nicht einmal mit verschiedenen Versionen des MSVC untereinander kompatibel. Aber sonst sollten die großen Compiler (GNU, Intel, IBM, ...) recht gut miteinander zurecht kommen. Getestet habe ich es für GNUs g++ und Intels icpc.

    P.S.: Und ich setze mal voraus, dass du nicht Sachen linken willst, die für unterschiedliche Zielplattformen kompiliert sind, das geht selbstverständlich nicht gut!



  • In DOS-Zeiten war der Einsatz verschiedener Compiler (z.B. FORTRAN, C, Assembler, ...) weitverbreitet und manchmal notwendig. Zu achten war auf die Einheitlichkeit der Datentypen und auf die Verwenung des Stacks.

    Ich kann mir die von SeppJ beschriebene Inkompatibilität bei MS-Compilern schwer vorstellen. Gerade MS-Compiler waren unter DOS sehr kompatibel und daher die beste Wahl.



  • DOS ist lange her. Mit MSVC kannst du inzwischen sogar Probleme mit dem selben Compiler bekommen, wenn verschiedene Patches eingespielt sind. Ich bin da mit MSVC 2005 mal drüber gestolpert, kurz nachdem dessen SP1 rausgekommen war.


  • Mod

    berniebutt schrieb:

    Ich kann mir die von SeppJ beschriebene Inkompatibilität bei MS-Compilern schwer vorstellen. Gerade MS-Compiler waren unter DOS sehr kompatibel und daher die beste Wahl.

    Das habe ich von Google so geflüstert bekommen, als ich geguckt habe, welche C++ (!) Compiler sich an eine einheitliche ABI halten und welche nicht.



  • cooky451 schrieb:

    Wie es mit unterschiedlichen GCC Versionen aussieht weiß ich nicht, aber mit unterschiedlichen Conpilern geht's leider nicht.

    Vielleicht stehe ich neben der Kappe, aber der Compiler erzeugt doch Object-Code - oder?? Wenn ich also einen sauberen ausführbaren Object-Code habe, liegt das doch nicht an unterschiedlichen Compilern, sondern eher am Linker diesen Code zu einer *.exe oder sonst einer Executable zu machen - Wenn der Linker das nicht kann, müsste doch da eine Fehlermeldung kommen????


  • Mod

    Object schrieb:

    Vielleicht stehe ich neben der Kappe, aber der Compiler erzeugt doch Object-Code - oder?? Wenn ich also einen sauberen ausführbaren Object-Code habe, liegt das doch nicht an unterschiedlichen Compilern, sondern eher am Linker diesen Code zu einer *.exe oder sonst einer Executable zu machen - Wenn der Linker das nicht kann, müsste doch da eine Fehlermeldung kommen????

    Genau so ist es.



  • Object schrieb:

    cooky451 schrieb:

    Wie es mit unterschiedlichen GCC Versionen aussieht weiß ich nicht, aber mit unterschiedlichen Conpilern geht's leider nicht.

    Vielleicht stehe ich neben der Kappe, aber der Compiler erzeugt doch Object-Code - oder?? Wenn ich also einen sauberen ausführbaren Object-Code habe, liegt das doch nicht an unterschiedlichen Compilern, sondern eher am Linker diesen Code zu einer *.exe oder sonst einer Executable zu machen - Wenn der Linker das nicht kann, müsste doch da eine Fehlermeldung kommen????

    Wenn zwei unterschiedliche Compiler die gleiche Template-Funktion aufrufen lassen und daraus zwei unterschiedliche Assembler-kompatible Namen generieren, dann hast du halt Pech gehabt... Da kann auch der Linker nichts helfen.


Anmelden zum Antworten