3

Dies ist die Situation.So verknüpfen Sie Ihre externen Bibliotheksabhängigkeiten in einer statischen Bibliotheksdatei in VS2015

Ich habe ein Bibliotheksprojekt A, das andere Drittanbieterbibliotheken verwendet und manipuliert, nennen wir sie T1 und T2.

Allerdings, wenn ich diese Bibliothek A in einem meiner anderen Projekte verwende, beschwert es sich, dass es die Drittanbieterbibliotheken T1 und T2 nicht öffnen kann, obwohl es sie nicht direkt verwendet. Natürlich verwendet es sie indirekt durch Bibliothek A, weil A die entsprechende Arbeit zum Verknüpfen und Einschließen gegen diese Bibliothek usw. gemacht hat.

Muss ich wirklich diese anderen Bibliotheken zu den Projekten hinzufügen, die Bibliothek A verwenden, oder gibt es eine Möglichkeit zu lassen Sagen Sie Bibliotheken so zusammen, dass der Benutzer der Bibliothek A sich nur darum kümmern muss, anstatt dessen, woraus er besteht.

Edit:

Gefunden einige verwandte Fragen, aber die Antworten lösen nicht ganz die Ausgabe;

linking-static-libraries-to-other-static-libraries

how-to-combine-several-c-c-libraries-into-one

Edit2:

Vielen Dank für die bisher Antworten. Lass mich meine Situation klären.

Ich habe ein .lib-Projekt in VS2015, die wir rufen MathLib. Diese MathLib verwendet können sagen, eine Boost-Bibliothek intern, um ihre Berechnungen zu tun, können diese Bibliothek aufrufen BoostMath. Die Eigenschaftendateien sind alle so eingestellt, dass sie diesen BoostMath enthalten und verwenden, und dies funktioniert perfekt im Bibliotheksprojekt selbst.

Ich mache jetzt ein anderes Projekt Benutzer, der die MathLib verwendet, um seine Berechnungen zu tun. Es enthält die entsprechenden Includes und alle, um diese Bibliothek zu benutzen. Es beschwert sich jedoch über die Tatsache, dass es die BoostMath-Bibliothek nicht kennt und daher nicht mit der MathLib-Bibliothek arbeiten kann.

Man könnte argumentieren, warum nicht nur BoostMath in Projekt Benutzer auf die gleiche Weise beinhalten, dass die MathLib Bibliothek dies tat, sondern dass der Punkt fehlt. Ich möchte eine eigene Bibliothek erstellen, die andere interne Bibliotheken verwenden kann oder auch nicht, aber dies sollte den Endbenutzer meiner Bibliothek nicht betreffen.

Ich muss wahrscheinlich etwas in VS Librarian setzen, um dies zu erreichen, verketten die Bibliotheken zusammen oder einige. Aber ich kann es nicht herausfinden. Irgendwelche Gedanken?

Edit3: Ich fand auch die exakt gleiche Kommandozeile in den Eigenschaftsdateien wie in diesen answer erwähnt.

/OUT:"MathLib.lib" "BoostMath.lib" /NOLOGO /LIBPATH:"path\lib" 

Allerdings funktioniert es aus irgendeinem Grund nicht. Wenn ich es mit und ohne die Librian-Eigenschafteneinstellung ausführe, bleibt die .lib-Binärdatei gleich.

Scheinbar ist diese Funktionalität seit VS2010 gebrochen? Nach this Antwort. Nützliche andere question. Edit4:

Ich mag im Grunde, dies zu tun, aber es scheint nicht

+---------------+ 
| End user exe | 
+---------------+ 
     | 
     | some api call 
     | 
+---------------+ 
| My MathLib | 
+---------------+ 
     | 
     | 
     +---------------+------------+---- 
     |    |   | 
+-----+------+ +-----+-----+ 
| BoostMath | | OtherMath | 
+------------+ +-----------+ 
+2

Wenn [diese Antwort] (http://stackoverflow.com/a/2157735/751579) bei der Frage, die Sie verknüpft haben, Ihre Frage nicht beantwortet, müssen Sie Ihre Frage klären, warum nicht. – davidbak

Antwort

1

Ich bin nicht sicher, in VS2015 zu arbeiten, wie Sie die Bibliothek in das Projekt verknüpfen ... aber Es sollte sich nicht beschweren, dass der Compiler die Bibliotheken T1 und T2 nicht öffnen konnte, es sei denn, Sie haben diese in die Compiler-Einstellung aufgenommen.

Normalerweise, wenn Sie die Bibliothek nicht haben, wird das Funktionsbeispiel T1_xxxx (diese Funktion ist in T1 definiert) nicht gefunden. Ich würde vorschlagen, überprüfen Sie die Compiler-Einstellung des Projekts

+0

Lesen zwischen den Zeilen, die Beschwerde, dass "es die Bibliotheken von Drittanbietern nicht öffnen kann" wahrscheinlich _is_ ist, indem es berichtet, dass es Methoden in ihnen nicht finden kann. Aber das OP sollte dies klären. – davidbak

+0

Die Sache ist, ich benutze VS2015. Wenn ich folge, was in den Antworten angegeben ist, wenn ich die Bibliothekareinstellung in VS einstelle, funktioniert es einfach nicht. – Montaldo

0

Grundsätzlich statische Bibliotheken keine Verknüpfung, und vor allem statische Bibliotheken haben keine Möglichkeit, ihre eigenen Abhängigkeiten anzugeben. Sie können das teilweise hacken, indem Sie #pragma comment(lib) um einzelne obj-Dateien herum verteilen (d. H. Einzelne Quelldateien), aber nicht auf der Bibliotheksebene - und es scheint, dass Sie nicht beabsichtigen, die lib-Quellen trotzdem zu ändern.

Ihre beste Option scheint die Bibliothek mit ihren Abhängigkeiten in einer einzigen Bibliothek zu kombinieren, wie z. here:

lib.exe /OUT:compositelib.lib lib1.lib lib2.lib

Beachten Sie, dass Sie neu Paket haben würde, wenn eine der Abhängigkeiten ändern. Ich selbst würde als Benutzer lieber alle referenzierten Bibliotheken in meine Consumer-Lösung aufnehmen.

+0

Es stellte sich heraus, dass dies früher in der GUI früherer Versionen von VS war, aber ab 2010 entfernt wurde. – Montaldo

+0

Sie erwähnen, dass Sie alle referenzierten Bibliotheken in Ihrer Consumer-Lösung bevorzugen würden. Aber das bedeutet, dass Sie alle Abhängigkeiten überall platzieren müssen, anstatt sie an einem Ort zu haben und nur darauf zu verweisen. Ich meine, das schafft viele mögliche Punkte des Scheiterns und viel mehr Wartungsprobleme tut es nicht – Montaldo

+1

@Montaldo es im Wesentlichen beläuft sich auf die erwartete Anzahl von "Verbraucher" vs die geschätzte Anzahl der Bibliotheksupdates. Genauer gesagt, das geschätzte * Wachstum * in der Anzahl der Konsumenten (seit dem Einrichten der Abhängigkeiten in einem Konsumenten ist eine einmalige Aufgabe), und persönlich finde ich, dass es selten die Rate überschreitet, mit der sich die abhängige Bibliothek selbst ändert. –