Ist es möglich, CMake anzuweisen, eine statische Bibliothek anstatt shared zu verknüpfen?
Oben in meinem CMakeLists.txt
habe ich folgendes konfiguriert:
Später füge ich eine Binärdatei hinzu und sage, dass sie im Freigabemodus mit tcmalloc
verlinkt:
Das resultierende Makefile verweist auf die freigegebene Version von tcmalloc
:
weiterer Beweis:
%Vor%Sowohl statische als auch freigegebene Versionen von tcmalloc existieren:
%Vor%Frage:
Wie kann ich CMake so konfigurieren, dass es mit der statischen Version von tcmalloc
verknüpft?
Sie können eine Hilfsfunktion erstellen, die CMAKE_FIND_LIBRARY_SUFFIXES
im Funktionsumfang festlegt ( also also nicht t den übergeordneten Bereich beeinflussen ), der nach der betreffenden Bibliothek sucht und eine Ausgabevariable mit dem Ergebnis
Sie können diese Funktion dann von irgendwo in Ihrem CMakeLists.txt
aufrufen, um eine Variable mit dem Speicherort der Bibliothek zu füllen.
Wenn es nicht gefunden wird, führt dies zu einem schwerwiegenden Fehler
%Vor% Sie können diese Variable dann in Ihrem Aufruf von target_link_libraries
verwenden und sicherstellen, dass Sie mit der statischen Version verknüpfen
Hier können Sie das Ergebnis sehen:
%Vor%%Vor%
Wenn Sie nur Nicht-Windows-Plattformen unterstützen müssen, diese alte E-Mail von der CMake Mailing-Liste von einem der Kitware-Entwickler bietet die einfachste Methode. Verwenden Sie im Wesentlichen find_library()
, um den Speicherort der aktuellen Bibliothek zu finden, indem Sie statische Bibliotheken gegenüber gemeinsamen Bibliotheken bevorzugen, indem Sie sie zuerst in den zu suchenden Namen auflisten. d. h.
Sie würden dann auf die übliche Weise auf die gefundene Bibliothek verlinken:
%Vor% Sie könnten schlauer darüber werden, wie Sie den Namen der statischen Bibliothek definieren, wenn Sie Plattformen unterstützen müssen, bei denen eine statische Bibliothek anders als lib???.a
benannt ist. Sie würden dafür die Variablen CMAKE_STATIC_LIBRARY_PREFIX und CMAKE_STATIC_LIBRARY_SUFFIX verwenden.
Unter Windows besteht das Problem darin, dass Sie nicht zwischen einer statischen Bibliothek und der Importbibliothek für eine DLL unterscheiden können, wie in dieses alte Problem im Kitware Bug Tracker. Beide haben die Dateierweiterung .lib
, so dass Sie die Erweiterung nicht verwenden können, um herauszufinden, ob eine bestimmte Datei eine statische Bibliothek ist oder nicht, anders als bei Unix-basierten Plattformen, wo Sie können.
Sie müssen Ihre CMAKE_FIND_LIBRARY_SUFFIXES-Variable auf diese Weise festlegen:
%Vor%weil im Standard CMAKE_FIND_LIBRARY_SUFFIXES auch das Suffix .so vorhanden ist (und es scheint nicht in der Reihenfolge des Einfügens zu suchen). Um Portabilität zu ermöglichen, sollten andere Suffixe hinzugefügt werden (siehe hier für Standardwerte von CMAKE_FIND_LIBRARY_SUFFIXES auf verschiedenen Plattformen).