[visual studio] statische bibliothek richtig linken



  • Hallo

    ich habe mit dem visual stuido 2008 express eine .lib erstellt, undzwar im
    Release-Modus mit der Multithread (ohne dll) als runtime

    diese möchte ich jetzt zu meinem anderen projekt hinzubinden, was aber
    nicht im release ist, und auch nicht in Multithread ohne dll (debug dll)

    da ich die datei auch in anderen programmen nutzen werde, will ich nicht
    immer die .lib neu erstellen

    daher meine frage: wie erstelle ich eine .lib so, dass sie problemlos mit
    debug und release, muthithread mit und ohne dll zurechtkommt (also wie
    eine normale lib z.b. DirectX oder andere WinApi libs) ?

    danke im voraus

    mfg libmaker



  • edit:

    habe es mal mit /NODEFAULTLIB:libcmt in der .lib probiert
    ➡ keine änderung, ich bekomme immer

    error LNK2005: __invoke_watson ist bereits in MSVCRTD.lib(MSVCR90D.dll) definiert.
    

    was ist das den für eine funktion und brauche ich die überhaupt?



  • versuch es mal über "ALT+F7"
    dann auf Linker -> Eingabe -> zusätzliche Abhänigkeiten
    dort deine .lib eintragen.



  • ich habe die .lib schon über

    #pragma comment
    

    drin, reicht das nicht ?


  • Mod

    Du kannst keine statische LIB bauen mit unterschiedlichen Compiler Switches, die die CRT beeinflussen. Das ist nicht möglich!

    Eine Statische Lib muss immer in den folgenden Dingen übereinstimmen:
    1. Selber Compiler
    2. CRT DLL oder statisch gelinkt muss stimmen
    3. Debug bzw. Non Debug muss stimmen.
    4. Sofern TCHAR verwendet wurde, muss auch UNICODE, MBCS übereinstimmen.



  • ok das leuchtet ein, aber wie schaffen es den andere bibliotheken dass sie sowohl
    debug/release und static/dynamic funktionieren z.b. wsock32.lib.

    die kann man ja auch einfach hinzulinken und gut ist, also muss man die
    bibliothek doch irgentwie erstellen können, dass sie genauso unabhängig
    von den einstellungen ist?



  • habs jetzt mit /NODEFAULTLIB und /FORCE:MULTIBLE gelöst
    zweitere ist aber nicht die "saubere" variante...

    naja es funktioniert danke an alle



  • libmaker schrieb:

    ok das leuchtet ein, aber wie schaffen es den andere bibliotheken dass sie sowohl
    debug/release und static/dynamic funktionieren z.b. wsock32.lib.

    die kann man ja auch einfach hinzulinken und gut ist, also muss man die
    bibliothek doch irgentwie erstellen können, dass sie genauso unabhängig
    von den einstellungen ist?

    Das sind in der Regel nur Importbibliotheken, die in keiner Weise CRT-Funktionen aufrufen. Sie sorgen nur dafür, dass der Linker die importierten Funktionen aus der jeweiligen Dll zuordnen und auflösen kann.


  • Mod

    libmaker schrieb:

    habs jetzt mit /NODEFAULTLIB und /FORCE:MULTIBLE gelöst
    zweitere ist aber nicht die "saubere" variante...

    naja es funktioniert danke an alle

    Das ist genau die Metode die strikt abzulehnen ist, weíl Du nicht wissen kannst welche CRT Teile an Dein Programm gebunden werden.



  • d.h. wenn ich keine crt funktionen in der lib benutze, kann der linker sie
    dann ignorieren ?


  • Mod

    libmaker schrieb:

    d.h. wenn ich keine crt funktionen in der lib benutze, kann der linker sie
    dann ignorieren ?

    😃 Das möchte ich sehen, wie Du das machst!
    In dem Moment in dem Du C++ Code und Klassen einbaust, autmatisches Exception-Handling eingebaut wird, new verwendest etc., kommt CRT ins Spiel.



  • jo das ist mir klar aber ich nutze keine Exceptions und new wird durch dann durch
    VirtualAlloc ersetzt. mir geht es nur darum dass die lib absolut unabhängig von
    den einstellungen wird. das muss doch gehen ?

    oder kann man nicht die .lib erst beim linken der anwendung an die crt knüpfen ?
    also als objektdatei


  • Mod

    libmaker schrieb:

    oder kann man nicht die .lib erst beim linken der anwendung an die crt knüpfen ?
    also als objektdatei

    Nein! Denn mittlerweile werden ja auch Manifest Einträgein den Objekt Code eingebaut.
    Vergiss es einfach. Man kann keine saische LIB erzeugen und dann CRT unabhängig sein. Das ist overkill.
    Bau eine DLL und liefere eine Import-Lib mit klarem Interface.
    Dadurch hast Du optimale Unabhängigkeit!

    Warum willst Du überhaupt eine statische Lib in dieser Form?

    Nur mal am Rande:
    1. Du beraubst dDich extrem vieler Features wenn Du auf VirtuallAlloc zurückgreifst. Kein Leak checking.
    2. Warum verwendest Du nicht GlobalAlloc? Wenn Du VirtualAlloc für jeden Mist verwendest ist das Ressourcenverschwednung ohne Ende.



  • das VirtualAlloc habe ich nur eingebaut weil es das erste windows-alloc war was
    mir eingefallen ist 😃 da ich aber nur an einer einzigen stelle etwas
    allokieren musste, kann es nicht so schlimm sein. allerdings verwendet die STL
    wieder new...

    also klappt das wirklich nicht.

    warum ich die lib statisch haben wollte: die lib ist ein kleiner windows-wrapper
    den ich aber öfter verwende und dann immer die dll mitliefern müsste. dachte
    das könnte man irgentwie umgehen.



  • so habs mit ner dll gelöst

    vielen dank nochmal an alle und besonders an Martin Richter


Anmelden zum Antworten