Announcement

Collapse
No announcement yet.

Statische libs in eine dll linken

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Statische libs in eine dll linken

    Hallo, ich habe folgendes Problem:

    Mein aktuelles Projekt besteht aus 8 statischen libs, welche gemeinsam in eine dll gepackt werden sollen.
    Ich benutze Visual Studi 2008. In der Projektmappe sind Projekte für die jeweiligen Libs, eins für die dll und eins für eine Testanwendung, welche Funktionen aus den einzelnen libs aufruft.

    Die statischen Libs werden ohne Probleme erstellt und befinden sich im Odner lib. Die dll kann auch erstellt werden, allerdings ist diese viel zu klein.

    Die Testanwendung bindet jetzt die dll ein, doch da kommen Fehlermeldungen wie:
    1>LINK : warning LNK4199: /DELAYLOAD:ASEA.dll wird ignoriert; keine Importe von ASEA.dll gefunden.
    1>Test.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_sigaction" in Funktion ""int __cdecl install_signal_handler(unsigned long,unsigned long,void (__cdecl*)(int))" (?install_signal_handler@@YAHKKP6AXH@Z@Z)".
    1>Test.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_sleep" in Funktion ""void * __cdecl threadfunc(void *)" (?threadfunc@@YAPAXPAX@Z)".
    1>Test.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_getppid" in Funktion ""void * __cdecl threadfunc(void *)" (?threadfunc@@YAPAXPAX@Z)".
    1>Test.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_statvfs" in Funktion "_main".
    1>Test.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_closedir" in Funktion "_main".
    1>Test.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_fcntl" in Funktion "_main".
    1>Test.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_readdir" in Funktion "_main".
    1>Test.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_opendir" in Funktion "_main".
    1>Test.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_uname" in Funktion "_main".
    1>..\Debug\ASEATEST.exe : fatal error LNK1120: 9 nicht aufgelöste externe Verweise.

    Was mache ich falsch? Liegt es eventuell daran, dass aus einer statischen Lib nur die verwendeten Teile gelinkt werden? Ist es überhaupt möglich mehrere libs in eine dll zu packen?

    MfG
    Thx

  • #2
    Zur Erläuterung

    Hallo nochmal, ich versuch mal mein Problem auf das wesentliche zu beschränken:

    in einem Beispielszenario gibt es die Bibliotheken libA.lib und libB.lib, die die Funktionen void hallo() und void ballo() besitzen.

    die Funktionalität soll in eine DLL zusammengefasst werden.


    LibA
    libA.h:
    Code:
    #ifndef LIBA_H
    #define LIBA_H
    
    extern "C" {
    	__declspec(dllexport) void hallo();
    }
    
    #endif // LIBA_H
    libA.cpp:
    Code:
    #include "libA.h"
    #include <iostream>
    
    void hallo() {
    	std::cout << "hallo" << std::endl;
    }
    Konfigurationstyp: Statische Bibliothek (.lib)

    LibB
    libB.h:
    Code:
    #ifndef LIBB_H
    #define LIBB_H
    
    extern "C" {
    	__declspec(dllexport) void ballo();
    }
    
    #endif // LIBB_H
    libB.cpp:
    Code:
    #include "libB.h"
    #include <iostream>
    
    void ballo() {
    	std::cout << "ballo" << std::endl;
    }
    Konfigurationstyp: Statische Bibliothek (.lib)

    Nun die DLL
    dll.h:
    Code:
    #ifndef DLL_H
    #define DLL_H
    
    #include "libA.h"
    #include "libB.h"
    
    #endif
    Main.cpp:
    Code:
    #include "windows.h"
    #include "dll.h"
    
    BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) 
    {
    	return TRUE;
    }
    Konfigurationstyp: Dynamische Bibliothek (.dll)
    Zusätzliche Includeverzeichnisse: ... die von libA und libB
    Zusätzliche Biliotheksverzeichnisse: ...die von libA und libB

    Und die Testanwendung
    Main.cpp:
    Code:
    #include <iostream>
    #include "dll.h"
    
    int main(int argc, char* argv[]) {
    	std::cout << "Nu gehts los:" << std::endl;
    	hallo();
    	ballo();
    	return 0;
    }
    Konfigurationstyp: Anwendung (.exe)
    Zusätzliche Includeverzeichnisse: ... die von libA und libB
    Zusätzliche Biliotheksverzeichnisse: Verzeichnis, wo die .dll liegt


    Als Fehlermeldung bekomm ich in der Konstellation:
    1>LINK : fatal error LNK1104: Datei "..\dll\dll.lib" kann nicht geöffnet werden.


    Ziel der ganzen Sache ist, dass die Anwendung nur noch die dll kennt (und die includes).

    Hat das schonmal jemand probiert?
    Ist es überhaupt möglich/gewollt sowas zu machen?
    Wenn ja, kann mir dabei jemand helfen?

    MfG

    Comment


    • #3
      Hallo,
      Möglich ist das selbstversändlich. Der linker muss bei deinem dll-projekt wissen, welche funktionien die dll exportieren soll. Wenn die dll zu klein ist, ist es offensichtlich, dass hier etwas fehlt.
      Ich müsste das jetz selbst ausprobieren, aber die deklaration mit dllexport() ist sicher richtig und wichtig.
      Wenn dein anwendungsprojekt die lib nicht findet, ist sie denn da? Willst du die dll automatisch einbinden oder soll sie dynamisch geladen werden?

      Comment

      Working...
      X