Problem beim Linken von statischen Libs(LNK4006)



  • Ich versuche, eine statische Lib zu erstellen, welche widerum andere (Fremd-)Libraries verwendet. Wenn ich diese direkt zu meiner Lib linke, hagelt es warnings vom Typ LNK4006 (symbol already defined in object; second definition ignored) und meine Lib funktioniert nicht 😞
    Die MSDN fand ich nicht besonders hilfreich, hab dann (wie vorgeschlagen) die fremden Libs mit der Einstellung /Gy neu kompiliert und auch alle andern Settings genau so gewählt, wie meine eigene Lib erstellt werden soll, hat aber leider nix gebracht. Der einzige Weg, das ganze zum Laufen zu bringen, ist alle Libs dann zu dem Projekt zu linken, welches meine Lib benutzt. Das gefällt mir aber überhaupt nicht...kennt ihr nicht eine Möglichkeit, die ganze Funktionalität in einer Lib zu kapseln?



  • welche symbole sind doppelt definiert?
    wenn es libc symbole sind ligts daran, dass die eine lib mit der multithreaded libc gelinkt is und die andere mit der singlethreaded



  • Die Reihenfolge der Libs beim Linkeraufruf spielt auch eine Rolle. Zuerst muss die C-Lib und danach die MFC gebunden werden. Danach kann anderes Zeug kommen.



  • @Sovok:
    Der Linker motzt alles an was in den Libs drin ist, am Ende stehen da 1622 Warnings die alle ungefähr so aussehen:

    ofstd.lib(ofthread.obj) : warning LNK4006: "public: static int const OFThread::busy" (?busy@OFThread@@2HB) already defined in ofstd.lib(ofthread.obj); second definition ignored
    ofstd.lib(oftime.obj) : warning LNK4006: "public: __thiscall OFTime::OFTime(void)" (??0OFTime@@QAE@XZ) already defined in ofstd.lib(oftime.obj); second definition ignored
    

    Ich hab auch schon alle Libs mit einheitlichen Settings (Multithreaded) neu erstellt...bin so langsam am verzweifeln...

    @7H3N4C3R:
    Wie stelle ich ein, in welcher Reihenfolge was hinzugelinkt wird? (im VS)



  • Öhm irgendwo in den Linker-Optionen. Weiß ich nicht aus dem Kopf, sorry. Irgendwo gibt's da ne monstermäßige Befehlszeile, in der musst Du editieren.

    Wobei ich jetzt nicht weiß, ob das was zuerst gelinkt werden soll als erstes oder als letztes im Linkeraufruf stehen muss.



  • Hab alles mögliche durchprobiert, leider ohne Erfolg...
    Hab allerdings keine Ahnung wie das mit der C-Runtime oder der MFC beim Linken läuft. Dachte eigentlich immer, dass ich in den Settings einfach einstellen kann, ob ich ich die MFC als statische Lib oder als Shared Dll linken will, und auch der ganze Runtime Kram über die Einstellung Single/Multithreaded...was auch immer ausgewählt wird.
    Aber es muss doch generell irgendwie gehen, dass man in eine Lib noch andere einbindet...sonst würde mir das VS diese Möglichkeit doch gar nicht zur Verfügung stellen... 😕



  • die libc einstellung für die libc findest du unter projekt->einstellungen->c/c++->code generation->use runtime library

    ne schnelle lösung wär unter projekt->einstellungen->link->customize ein häkchen bei dateiausgabe erzwingen zu setzen
    dann ignoriert er den kram einfach


Anmelden zum Antworten