Gelöscht
-
sk0r schrieb:
Habe ich das richtig verstanden, dass man dann aber
nicht dlopen usw. benutzen kann? Sorry, mein Englisch ist schlecht.
Ich muss aber dlopen/dlsym/dlclose benutzen. Gibt es dafür eine Lösung?Also... Da steht, dass das dynamische laden von Code im Widerspruch zum statischen Linken mit der C++-Runtime steht. Es könnte aber Linker geben mit denen das Funktioniert, aber wenn man das tut, dann soll man mit einer Menge von Fallen und Fehlern rechnen.
Das Problem sollte sein, dass der Linker auf dem Zielsystem anders Funktioniert, als auf dem System, auf dem du das Programm übersetzt hast. Und wenn du dynamischen C++ Code lädst, der auf einem anderen System drauf ist, dann kann es sein, dass der mit einer vollkommen anderen C++-ABI arbeitet, also die Binärformate nicht kompatiebel sind.
Ich kenn mich mit dem Thema nicht gut genug aus, um da mehr zu zusagen. Aber ich denke, wenn statisch, dann komplett statisch, sonst wird es wirklich schwierig.
-
...
-
ich habe keine erklärung für die behauptung, dass man mit der libstdc++ statisch gelinkte exe dateien kein dlopen verwenden darf/kann, gefunden. was leider mal wieder schade ist. vielleicht habe ich es auch übersehen.
gründsätzlich würde ich aber nicht zum statischen linken raten. man bekommt damit eher mehr probleme, als dass man sie löst. außerdem werden die exe dateien größer als nötig und du musst dich auch um bugfixes der libstdc++ kümmern. wenn die lib dynamisch gelinkt ist, ist dafür die distribution verantwortlich.
-
...
-
ich nehme an, dass deine bibliothek ein plugin ist. dementsprechend ist es wie bei normalen shared libraries nötig, den code mit -fpic zu compilieren und dann mit -shared zu linken, man kann aber auf das -soname verzichten.
sollten spezieller optionen nötig sein, sollten die in der doku zur software, die das plugin läd, enthalten sein.
-
...
-
sk0r schrieb:
Ne, ich mache kein Plugin, das soll ein eigenes Modul werden.
Und mit -fPIC und -shared habe ich ja compiled, trotzdem benötigt er die libstdc++.so.6, aber metamod_i386.so benötigt das nicht. Wie hat der das denn gemacht, der Autor von MetaMod?
Das kann ich dir nicht beantworten. Aber du kannst ja in den Quelltext rein schauen, bzw. in die Makefiles. Und wenn du damit nicht weiter kommst, schreib ihm doch eine Mail.
Was ich mir vorstellen könnte: Du nutzt dynamische Bibliotheken. Die libstdc++ linkst du statisch. Deine Module exportieren aber nur(!) eine C-Schnittstelle mit extern "C". Die C-ABI ist stable. Und du linkst halt dynamisch mit der libc. So dass du alles was mit C++ zu tun hast statisch linkst und für alle Schnittstellen die stabile C-ABI nimmst. Garantieren, dass das funktioniert kann ich aber nicht.
-
...
-
sk0r schrieb:
Und nur eine Funktion zu exportieren geht nicht, da ich mindestens drei exportieren muss.
Nein. Das meinte ich auch nicht. Ich meinte, dass du nur Funktionen exportierst, die mit extern "C" gekennzeichnet sind. Und sonst nichts weiter...
-
...