Wie cmake Bibliotheken von Drittanbietern unterstützt

1. Einleitung

Im Prozess der Programmentwicklung werden häufig Bibliotheken (dynamische Bibliotheken und statische Bibliotheken) eingeführt. Manchmal nur eines davon, manchmal eine Mischung aus beiden. In diesem Fall stellt sich die Frage, wie die Bibliothek im Projekt unterstützt werden soll (dabei geht es nicht um die Versionsverwaltung der Bibliothek, d. h. es werden keine Probleme wie DLL HELL behandelt). Es gibt viele Möglichkeiten, dies zu tun, und unterschiedliche Plattformen und unterschiedliche Entwicklungstools verfügen über unterschiedliche Verarbeitungsmethoden. Beispielsweise gibt es Unterschiede zwischen VS und Idea, und verschiedene Sprachen können unterschiedlich damit umgehen. Dies alles muss je nach tatsächlicher Situation von den Entwicklern selbst gehandhabt werden.
Hier erwähnen wir nur einige Methoden zur Verwendung von Cmake unter Linux für die Bibliotheksverwaltung von Drittanbietern.

Zwei, vier Formen

Wenn Sie Cmake zum Erstellen und Verwalten verwenden, gibt es unter Linux hauptsächlich folgende Möglichkeiten, die dritte Bibliothek zu verwenden:
1. Direkte Kompilierung und Kompilierung
Dies ist die am häufigsten verwendete Methode und wird von Entwicklern verwendet. Die alte Art der Verwendung ist im Allgemeinen:

mkdir build
cd build 
cmake ..
make -j5
make install

Höhere Versionen von CMake unterstützen jedoch die folgenden einfacheren Methoden:

cmake -B build -DCMAKE_PREFIX_PATH=/home/fpc/Qt65/6.5.0/gcc_64   (通过 -S 可以 指定编译路径 -G指定构造方式 如Ninja)
cmake --build build -j5(--parallel 5)

Der große Bruder auf Station B nannte dieses moderne CMake, was Sinn macht.
Diese Methode eignet sich eher für Anfänger oder Orte, an denen das Projektmanagement einfach ist. Der Vorteil besteht darin, dass es leicht zu verstehen und zu bedienen ist. Der Nachteil besteht darin, dass Sie die Kompilierung und Verknüpfung der Bibliothek in der CMake-Datei des Projekts manuell steuern und verwalten müssen. Ähnlich wie folgt:

find_package (库名称 1.6.0 REQUIRED)

add_executable (myapp main.cpp)
target_link_libraries (myapp 库名称)

Wenn es Entwicklungsumgebungen mit unterschiedlichen Versionen oder unterschiedlichen Maschinen gibt, kann es bei der Zusammenarbeit von Teams zu unerwarteten Problemen kommen. Die Merkmale dieser Art von Problem sind zufällig und nicht leicht zu finden. Wenn diese Methode also in einem etwas größeren Projekt übernommen wird, müssen strenge Anweisungen zur Bibliotheksversionsverwaltung und Abhängigkeitsverwaltung vorhanden sein. Aber jeder versteht, dass es oft unzuverlässig ist, sich auf Menschen zu verlassen.

2. CMake arbeitet mit der Submodulsteuerung von Git-Submodulen zusammen

Diese Methode eignet sich für eine effektive Verwaltung auf Quellcodeebene zwischen Teams und ist nicht für Dritte geeignet, die nur Bibliotheken bereitstellen. Darüber hinaus ist die Bibliothek eines Drittanbieters parallel zu anderen Projekten, das heißt, die Bibliothek eines Drittanbieters gehört nicht dazu zu einem bestimmten Projekt, achten Sie also unbedingt darauf. Verwenden Sie den entsprechenden Pfad:

增加子模块:
cd examples
git submodule add http://xxx.xxx/libname.git
下载子模块:
git clone --recursive   git@xxxxxx/parent_libname.git
或者没有使用 --recursive 下载完成后,进入子目录执行:
git submodule update --init

Fügen Sie dann Folgendes zur gesamten CMakeLists.txt-Datei des Projekts hinzu:

add_subdirectory(${CMAKE_SOURCE_DIR}/examples/libname)

Fügen Sie dem Projekt CMakeLists.txt der Drittanbieterbibliothek der Anwendung Folgendes hinzu:

add_dependencies(SUPRA_Lib libname)
TARGET_INCLUDE_DIRECTORIES(SUPRA_Lib
        PUBLIC ${SUPRA_Lib_INCLUDEDIRS} libname_include
)

target_link_libraries(SUPRA_Lib ${SUPRA_Lib_LIBRARIES} libname_path)

Auf diese Weise kann die Bibliothek ohne äußere Einwirkung fest eingebunden werden. Verwaltung auf Quellebene für einfache Steuerung. Der Nachteil liegt ebenfalls auf der Hand: Das Upgrade mit vielen externen Bibliotheken ist mühsam und gleichzeitig muss jedes verwendete Projekt die oben genannten abhängigen Projekte hinzufügen.

3. Direkt zum Unterverzeichnis des Projekts hinzufügen.
Der Unterschied zum oben Gesagten besteht darin, dass diese Drittanbieterbibliothek tatsächlich ein Unterverzeichnis eines bestimmten Projekts werden muss, das heißt, add_subdirectory befindet sich unter der CMakeLists.txt eines bestimmten Projekts, z. B. dem von Google glog bietet Folgendes:

add_subdirectory(${CMAKE_SOURCE_DIR}/examples/libname)
target_link_libraries(firt libname)

Es ist so einfach und uneingeschränkt, dass Sie es direkt verwenden können und sich nicht mit Header-Dateien und add_dependencies, find_package und dergleichen befassen müssen. Der Nachteil besteht darin, dass es möglicherweise nicht so klar ist wie die Aufteilung in Module und die Wartung großer Projekte möglicherweise etwas umständlich ist.

4. Die Methode zur Verwendung eines externen Projekts
Die detaillierte Methode zur Verwendung dieser Methode finden Sie in der CMake-Dokumentation. Hier ist ein Beispiel:

include(ExternalProject)

SET(NodeEditor_DIR "${CMAKE_CURRENT_BINARY_DIR}/NodeEditor")
SET(NodeEditor_GIT_REPOSITORY "https://github.com/goeblr/nodeeditor.git" CACHE STRING "")
SET(NodeEditor_GIT_TAG "3bcba3740d68932f3ffaa4b3dc73e624fe51e2db" CACHE STRING "")
ExternalProject_Add( 
	NodeEditor
	PREFIX "${NodeEditor_DIR}"
	
	LOG_DOWNLOAD TRUE
	LOG_UPDATE TRUE
	LOG_CONFIGURE TRUE
	LOG_BUILD TRUE
	LOG_INSTALL TRUE
	
	SOURCE_DIR "${NodeEditor_DIR}"
	BINARY_DIR "${NodeEditor_DIR}_build"
	STAMP_DIR "${NodeEditor_DIR}_stamp"
	TMP_DIR "${NodeEditor_DIR}_tmp"
	#--Download step--------------
	GIT_REPOSITORY ${NodeEditor_GIT_REPOSITORY}
	GIT_TAG ${NodeEditor_GIT_TAG}
	#--Configure step-------------
	CMAKE_ARGS
	  -DCMAKE_RUNTIME_OUTPUT_DIRECTORY:PATH=${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
	  -DCMAKE_LIBRARY_OUTPUT_DIRECTORY:PATH=${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
	  -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY:PATH=${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}
	  -DCMAKE_BUILD_TYPE=Release
	  -DBUILD_EXAMPLES=OFF
	  -DQt5_DIR=${Qt5_DIR}
	  -DCMAKE_INSTALL_PREFIX=${NodeEditor_DIR}_install
	  -DNODE_EDITOR_STATIC=
	#--Build step-----------------
	#BUILD_ALWAYS 0
	#--Install step-----------------
	INSTALL_DIR=${NodeEditor_DIR}_install
)
SET(NodeEditor_LIBRARIES "nodes")
INCLUDE_DIRECTORIES(SUPRA_GUI "${NodeEditor_DIR}_install/include")
LINK_DIRECTORIES(SUPRA_GUI "${NodeEditor_DIR}_install/lib")

Dann noch im aktuellen Projekt:

TARGET_LINK_LIBRARIES(SUPRA_GUI
	${NodeEditor_LIBRARIES})
add_dependencies(SUPRA_GUI SUPRA_Lib NodeEditor)

Diese Methode ist nicht einfach, aber flexibel in der Anwendung. Man kann sagen, dass jeder Code, der verwendet werden kann, auf diese Weise betrieben werden kann. Die Mängel liegen ebenfalls auf der Hand, es ist kompliziert und muss sich mit vielen Dingen befassen, die nichts mit der Kompilierung zu tun haben.

3. Zusammenfassung

Derzeit sollte CMake der Mainstream-Modus in C++-Engineering-Anwendungen sein. Der Vorteil seiner Verwendung besteht darin, dass es viel einfacher ist als das Schreiben von MakeFile, für Entwickler besser verständlich und relativ einfach ist. Der Nachteil ist, dass dieses Ding zu viele Makrodefinitionen hat und verschiedene Fehler nicht leicht zu verstehen sind. Wenn Sie auf seltsame Probleme stoßen, müssen Veteranen möglicherweise weinen. Mängel verbergen keine Vorteile, studieren intensiv und verwenden mehr und ergreifen die Initiative, um einige Fallstricke zu vermeiden. Sie werden feststellen, dass CMake immer noch ein sehr gutes Werkzeug ist.

Supongo que te gusta

Origin blog.csdn.net/fpcc/article/details/131582753
Recomendado
Clasificación