dll gegen dll linken: problem mit VC++ importlibs
-
Servus,
ich möchte eine .dll gegen eine andere dll linken.
Unter Linux klappt das ganz simpel, da ja shared objects per default undefinierte symbole haben dürfen, die dann zur Laufzeit aufgelöst werden.
Funktioniert auch sehr gut.Unter Windows kompiliere ich mit Visual C++ 2010 Express, und stoße da auf das Problem, dass scheinbar unter Windows dlls keine undefinierten Symbole haben dürfen.
Aber dafür wurde ja das konzept der importlib erfunden. Die fragliche Komponente A wird von VC++ zu einer a.dll und einer a.lib kompiliert, wobei die a.lib wohl die importlib ist.Also habe ich jetzt Komponente B gegen die exportlib von A, a.lib, zu linken versucht. Klappt aber nicht. Der VC++ Linker moniert immer noch undefinierte Symbole.
Zur Gegenprobe habe ich A mal als staticlib kompiliert. Dann fällt eine Datei namens liba.lib heraus. Wenn ich B gegen diese linke, geht's plötzlich. Aber jetzt habe ich mir den Code ja statisch reingelinkt und ihn daher zur Laufzeit "doppelt", oder?
Wie schaffe ich es, dass die dll B gegen die Importlib von A, a.lib gelinkt wird?
Philipp
-
DLLs dürfen keine undefinierten Symbole haben!
Was DU willst sind nur LIBs, die dürfen auch undefinierte Symbole haben.
-
Aber das ist doch gerade der Sinn der importlibs: die definiert die Symbole, aber da steht kein Code dahinter (mal vereinfacht ausgedrückt). Der objektcode, der zu diesen Symbolen gehört, wird ja zur Laufzeit aus der dll ausgeführt.
Deshalb linke ich doch mein Programm oder meine dll, die die dll benutzen sollen, gegen diese importlib, damit die Symbole alle definiert werden.
Aber genau dieser letzte Schritt klappt nicht.Philipp
-
Naja, offenbar versucht deine B.dll Zeug zu linken dass von der A.dll eben nicht exportiert wird, anders kanns eigentlich nicht sein...
-
dot schrieb:
Naja, offenbar versucht deine B.dll Zeug zu linken dass von der A.dll eben nicht exportiert wird, anders kanns eigentlich nicht sein...
Schreib ich chinesisch? Ich habe doch gesagt, sobald ich A als statische lib kompiliere, lässt sich B.dll gegen eben diese statische lib linken und alle symbole können aufgelöst werden. Wenn ich hingegen nur einen Parameter ändere, nämlich A dynamisch baue, und b gegen die importlib linke, werden die symbole nicht mehr aufgelöst.
Also: Gibt es in msvc irgendeinen mechanismus, der verhindert, dass symbole in die importlibs dynamischer Bibliotheken exportiert werden, obwohl sie in der statischen lib vorhanden sind? Sowas wie "visibility hidden" bei gcc?
Aber das kanns ja auch nicht sein, denn die Symbole sind ja offenabr in der dll.Kann ich irgendwie in die importlib reinschauen, welche Symbole sie exportiert? Unter linux macht man das mit nm.
Philipp
-
Ich kann schon gelesen was du geschrieben hast...
Was genau für Fehler bekommst du, was für Symbole sind das die er nicht finden kann?
In eine lib reinschaun kannst du mit dumpbin.exe.