Was bedeutet "name mangling" ?
-
Hi..
ich habe ein problem mit einer Lib .. die ich nicht kompilieeren kann..
mein "mentor" meinte :Wir können wohl versuchen, einen 4.1.3er gcc zu insallieren, die Frage ist
allerdings, ob Euch damit wirklich geholfen ist. Das Problem ist nämlich, daß
die gcc-Entwicklern mit beinahe jeder neuen Version ihrer Compiler Suite ein
anderes "Name Mangling" beim Übersetzen von C++ Code einführen, so daß man
als Entwickler gezwungen ist, alle für den eigenen Code benötigten C++
Bibliotheken mit derselben Compiler-Version zu übersetzen.Wie kann man sowas beheben ?
-
name mangling ist das zusammensetzen von eindeutigen strings anhand der eingangsparameter, bei c++ z.b. dem rueckgabe-typ, namespaces, classes/structs/ parametern, constantness usw.
was du mit beheben meinst versteh ich nicht ganz. die sache an sich ist ja einfach und steht ja schon im zitat, einfach den kompletten source mit der entsprechenden version von gcc bauen.
-
Hi ,
rapso schrieb:
name mangling ist das zusammensetzen von eindeutigen strings anhand der eingangsparameter, bei c++ z.b. dem rueckgabe-typ, namespaces, classes/structs/ parametern, constantness usw.
Hast du vllt ein konkretest Beispiel ? .. ich kann mir das nicht so vorstellen ?
rapso schrieb:
was du mit beheben meinst versteh ich nicht ganz. die sache an sich ist ja einfach und steht ja schon im zitat, einfach den kompletten source mit der entsprechenden version von gcc bauen.
ja .. das hab ich gemacht .. es geht auch .
Aber das ist doch "schlechter stil" .Man sollte doch meinen ,dass es Compiler-unabhängig läuft :p
-
Also, zur Frage im Titel:
Name Mangling bedeutet, dass Symbole, die der Compiler erzeugt (z.B. Funktionen, globale Variablen, etc.) im Compileroutput nicht den gleichen Namen haben wie im Quelltext.
Unter C ist es z.B. so, dass eine Funktion "myfunc" im Output auch "myfunc" (oder je nach Plattform auch "_myfunc", "myfunc@0" o.ä.) heisst und von einem anderen Compiler gefunden werden kann.
Unter C++ sieht das ganze, bedingt durch Namespaces, aber insbesondere durch ein Feature namens Funktionsüberladung, etwas anders aus. Hier könnte es z.B. eine Funktion myfunc(int) und eine Funktion myfunc(std::string, float) geben. Um diese unterscheiden zu können, heissen die im Compileroutput aber nicht "myfunc", sondern z.B. "myfunc_i" und "myfunc_std__string_f".
Das Problem ist nun, dass diese Funktion bei einem gcc 3.2 jetzt "myfunc_i" heissen könnte, bei einem gcc 3.4 "_myfunc_i" und bei einem gcc 4.2 "myfunc_i32". Wenn Du nun mit gcc 3.2 eine Bibliothek erstellst (Compiler sieht "myfunc(int)" und erzeugt den Namen "myfunc_i") kannst Du diese nicht mit gcc 4.2 verwenden (Compiler sieht "myfunc(int) und sucht "myfunc_i32", und die gibt es nicht).
Und zur Frage im Text:
n00ki3 schrieb:
Wie kann man sowas beheben ?
Dein Mentor beantwortet diese Frage bereits:
n00ki3s mentor schrieb:
[...] so daß man
als Entwickler gezwungen ist, alle für den eigenen Code benötigten C++
Bibliotheken mit derselben Compiler-Version zu übersetzen.
-
[quote="n00ki3"
Aber das ist doch "schlechter stil" .Man sollte doch meinen ,dass es Compiler-unabhängig läuft :p[/quote]
Nein, wo steht das etwas Compiler-unabhängig ist? Die Sprache C++ ist Plattform-unabhängig. Aber nur die Sprache. Das was rauskommt (nach dem kompilieren) ist natürlich Compiler- und/oder Plattform-abhängig.
-
LordJaxom schrieb:
Das Problem ist nun, dass diese Funktion bei einem gcc 3.2 jetzt "myfunc_i" heissen könnte, bei einem gcc 3.4 "_myfunc_i" und bei einem gcc 4.2 "myfunc_i32". Wenn Du nun mit gcc 3.2 eine Bibliothek erstellst (Compiler sieht "myfunc(int)" und erzeugt den Namen "myfunc_i") kannst Du diese nicht mit gcc 4.2 verwenden (Compiler sieht "myfunc(int) und sucht "myfunc_i32", und die gibt es nicht).
problem ist auch dass man selbst eine funktion myfunc_i nennen koennte und der compiler damit klarkommen muss. oder dass man
namespace foo { void bar(){} }
class foo { void bar(){} };
unterscheiden koennen moechte und da gibt es 1000fehlerquellen weshalb auch gcc das mangling von version zu version "verbessert"
ein kolege von mir hat damit taeglich zu tun und er muss das nachbilden, entsprechend schmerzhaft ist das umsteigen auf eine neue gcc version, das neu bauen ist dagegen echt ein klacks
-
Um das zu beheben könntest du auch die funtkion , Variable etc. als extern "C" deklarieren.
-
LordJaxom schrieb:
Dein Mentor beantwortet diese Frage bereits:
n00ki3s mentor schrieb:
[...] so daß man
als Entwickler gezwungen ist, alle für den eigenen Code benötigten C++
Bibliotheken mit derselben Compiler-Version zu übersetzen.Nö, es geht nicht um Compiler-Versionen, sondern um ABI-Versionen.