LNK2005 bei selber geschriebenen Libraries
-
Hallo,
ich habe Probleme mit dem Erstellen und Einbinden von selber geschriebenen statischen Bibliotheken.Auf der MSDN Seite Walkthrough: Creating and Using a Static Library klingt alles recht einfach...
Wie der Fehlercode LNK2005 schon besagt, habe ich Probleme mit mehrfach definierten Symbolen.
Ich denke meine Probleme dabei kommen daher:
-meine statischen Bibliotheken bestehen nicht nur aus rein selbst programmierten
Funktionen sondern greifen auf Windows-Funktionen zu.
-eine selber programmierte statische Bibliothek greift auf eine andere selber
programmierte Bibliothek zuIch weiß nicht wie ich die Einstellungen vornehmen muss damit das klappt.
Also konkret ist die Konstellation wie folgt:
I habe drei selber programmierte statische Bibliotheken, nennen wir sie "Bib_1", "Bib_2" und "Bib_3" und eine Anwendung "Programm.exe".
"Bib_1" enthält allgemeine Hilfsfunktionen die von allen meinen Projekten gebraucht werden können.
"Bib_2" enthält auch Funktionen, die von mehreren Projekten genutzt werden sollen. "Bib_2" greift bei der Implementierung auf "Bib_1" zurück.
"Bib_3" enthält ebenfalls Funktionen, die von mehreren Projekten genutzt werden sollen. "Bib_3" greift bei der Implementierung auch auf "Bib_1" zurück.
Dann gibt es noch die Programme in dem alles zusammenkommen soll. "Programm_1.exe" und "Programm_2.exe" soll "Bib_2" und "Bib_3" einbinden.
Die Bibliotheken und Header-Dateien sowie deren Pfade sind in allen oben genannten Projekten angegeben und werden auch vom Compiler bzw. vom Linker gefunden.
Ich habe herausgefunden, dass ich "Programm_1.exe" erstellen kann wenn ich folgende Einstellungen mache:
Für "Bib_1", "Bib_2" und "Bib_3" jeweils
-Verwendung von MFC: "MFC in einer statischen Bibliothek verwenden"
-Alle Standardbibliotheken ignorieren: "Ja (/NODEFAULTLIB)"
-Zusätzliche Abhängigkeiten: leerFür "Programm_1.exe" muss ich auch
-Verwendung von MFC: "MFC in einer statischen Bibliothek verwenden"
angeben. Jedoch darf ich hier natürlich nicht die Standardbibliotheken ignorieren, stattdessen gebe ich hier die zusätzlichen Abhängigkeiten an, sonst findet er einige Symbole nicht (LNK2001).Aber nun mein Problem: ich will mein zweites Programm "Programm_2.exe" nicht mit der Einstellung
"MFC in einer statischen Bibliothek verwenden"
erstellen sondern mit
"Windows-Standardbibliotheken verwenden"
bzw.
"MFC in einer gemeinsam genutzten DLL verwenden"Und da taucht dann LNK2005 auf. Betroffen sind dabei aber nicht direkt meine eigenen Funktionen sondern vermutlich Windows-Funktionen oder Funktionen aus der Standard-Bibliothek, die von meinen Funktionen direkt oder indirekt aufgerufen werden.
Wie muss ich denn meine Projekte einstellen damit das klappt?
Geht das überhaupt?MfG
-
Du musst zwei Varianten deiner statischen LIBs bauen.
Eine die die DLL Runtime verwendet und eine die die statische Runtime verwendet.Ist lästig, aber andere Lösung kenn ich keine.
(Bzw. keine saubere - natürlich kann man dem Linker sagen er soll eine der beiden CRTs ignorieren, aber pfuh... keine Ahnung ob das so ne gute Idee ist)
-
Dass ich die einzelnen Bibliotheken mit den selben Einstellungen erstellen muss, leuchtet mir langsam ein. Denn Visual Studio linkt für jede Einstellung eine andere Bibliothek. Und wenn in der selber erstellten Bibliothek die eine Standard-Bibliothek gelinkt wird und im Haupt-Programm dann eine andere, dann überschneiden sich dort manche Symbole und es kommt zu LNK2005-Fehlern. Wenn man die gleichen Einstellungen vornimmt, wird automatisch erkannt dass sowohl Bibliotheken als auch Haupt-Programm auf die selben Bibliotheken verweisen und es wird nur einmal gelinkt und es gibt somit keine Überschneidungen der Symbole.
Stimmt das so?
Habe dazu noch folgendes gefunden:
C Run-Time Librariesund in
[visual studio] statische bibliothek richtig linkenMartin Richter schrieb:
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.Ich habe jetzt für die beiden Bibliotheken und für das Programm folgende Einstellungen gleich:
Allgemein --> Verwendung von MFC: MFC in einer gemeinsam genutzten DLL verwenden
Allgemein --> Zeichensatz: Unicode-Zeichensatz verwenden
C/C++ --> Laufzeitbibliothek: Multithreaded-DLL (/MD)Der selbe Compiler ist es sowieso. Es ist in allen Fällen die Release-Variante.
So funktioniert es jendenfalls. Ich muss halt zwei Varianten erstellen. Eine, die die DLL Runtime verwendet und eine die die statische Runtime verwendet. Aber das ist okay für mich!
Danke @hustbaer !
P.S.: Die Option Allgemein --> Optimierung des gesamten Programms spielt auch noch eine Rolle, wie es scheint. Ich sollte dies bei den Bibliotheken auf den Wert "Keine komplette Programmoptimierung" stellen und erst in den Programmen, die diese Bibliotheken verwenden auf "Link-Zeitcodegenerierung verwenden" stellen.
Sonst werden wohl Symbole, die in den Bibliotheken nicht gebraucht werden, weg-optimiert und in den letztendlichen Programmen werden sie dann vergeblich gesucht. Denn dort bekomme ich sonst LNK2001-Fehler.
Hab ich das richtig verstanden?
MfG