Ich habe zwei Dateien 37064544_p1.cpp
& amp; 37064544_p2.cpp
mit dem gleichen Inhalt wie unten gezeigt:
Ich habe sie mit
kompiliert %Vor%und fügte sie mit
zu einem Archiv hinzu %Vor%Und
%Vor%gibt mir:
%Vor%und
%Vor%gibt mir
%Vor% Ich habe einen Treiber, der die Funktion _Z3addii
aufruft, die mit
Ergebnis ist
%Vor%Fragen
Wie ist das Symbol% co_de% aufgelöst?
_Z3addii
? Wie kann ich diese Reihenfolge ändern?
ar
doppelte Symbole hat? Compiler: g ++ 4.6.3
Wie wird das Symbol _Z3addii aufgelöst?
Die Implementierung ist frei, zu tun, was immer Sie wollen, Sie verletzen die eine Definitionsregel .
Realistisch gesehen hört es nach der ersten Übereinstimmung auf, nach einem bestimmten Symbol zu suchen, das vermutlich der Reihenfolge folgt, in der die Dateien in das Archiv eingefügt wurden.
Wie kann ich diese Reihenfolge ändern?
Mit ar
können Sie die Modifizierer a
(after) und b
(before) verwenden, um Objektdateien im Archiv zu positionieren, wenn Sie sie einfügen. Trotzdem verletzen Sie das ODR.
Wie kann ich verhindern, dass ar doppelte Symbole hat?
Soweit ich weiß, ist ar
relativ dumm und aus gutem Grund, da einige Sprachen identische Symbole zulassen, weshalb Sie beim Verknüpfen mit dem Archiv keine Fehler haben (keine Diagnose ist für ODR-Verstöße erforderlich).
Sie können ld
entweder zwingen, das gesamte Archiv zu lesen
Oder Sie können eine Teilverknüpfung anstelle eines herkömmlichen Archivs ausführen, die Ihnen einen Fehler anzeigt, wenn Duplikate vorhanden sind
%Vor%Tags und Links c++ g++ static-linking ar nm