2012-04-03 10 views
13

Ich möchte cmake verwenden, um meine Build-Dateien für ein C++ - Projekt zu generieren. Ich habe eine bestehende Makefile. Ich habe Probleme beim Generieren dieser Makefile mit der Standard cmake Syntax.Erstellen von CMakeLists Datei aus vorhandenen Makefile

Wie schließe ich Standard-C++ - Bibliotheken wie -lstdc++ -lpthread -lboost_thread-mt im TARGET_LINK_LIBRARIES-Abschnitt von cmake ein? Oder sollten diese Dateien im Abschnitt ADD_DEPENDENCIES enthalten sein.

(OR) Gibt es ein einfaches Werkzeug, das eine CMakeList.txt Datei von einem Like this Makefile

Antwort

9

Leider gibt es keine einfache 1 verwenden: 1 Umwandlung von Makefiles zu CMakeLists. Da CMake auf allen Plattformen laufen soll, kann es sich nicht auf plattformspezifische Annahmen wie GNU make verlassen, was die Dinge an bestimmten Orten verkompliziert.

Insbesondere bietet CMake einen sehr leistungsfähigen und ziemlich komplexen Mechanismus für die Verwendung von Bibliotheken: Sie rufen find_package mit dem Namen Ihrer Bibliothek, die ein Bibliothekssuch Skript aus Ihrem CMAKE-Modul Pfad aufrufen wird. Dieses Skript (das auch in CMake geschrieben wird) versucht, den Speicherort der Header- und Lib-Dateien der Bibliothek zu ermitteln und sie in einigen CMake-Variablen zu speichern, die dann an die entsprechenden CMake-Befehle wie include_directories und target_link_libraries übergeben werden können.

Es gibt zwei Probleme mit diesem Ansatz: Zuerst benötigen Sie ein Suchskript. Glücklicherweise wird CMake mit Suchskripten für Pthreads, Boost und ein paar anderen ausgeliefert, aber wenn Sie eine exotischere Bibliothek verwenden, müssen Sie vielleicht das Suchskript selbst schreiben, was auf den ersten Blick eine arkane Erfahrung ist ...

Das zweite große Problem ist, dass es kein Standardverfahren für ein Suchskript gibt, das seine Ergebnisse zurückgibt. Zwar gibt es Namenskonventionen für die verwendeten Variablen, diese gelten jedoch häufig nicht. In der Praxis bedeutet das, dass Sie die Quelle eines Suchskripts auschecken müssen, um zu wissen, wie Sie es verwenden. Glücklicherweise sind die mit CMake gelieferten Skripte größtenteils sehr gut dokumentiert.

Die eingebauten Skripte befinden sich irgendwo wie <cmake-install-prefix>/share/cmake-2.8/Modules. Sehen Sie sich für Ihre Frage die Dateien FindBoost.cmake und FindThreads.cmake an (CMake sollte automatisch mit der Standardbibliothek verknüpft sein). Anycorn gab bereits einen Beispielcode für die Verwendung des Boost-Skripts, alles Weitere, was Sie wissen müssen, finden Sie in der CMake-Dokumentation oder direkt in den Suchskriptdateien.

2

erzeugt:

target_link_libraries(your-target-name pthread boost_thread-mt etc) 

Sie sollten nicht add_dependencies verwenden, wenn Sie Bibliotheken verknüpfen möchten. Die Verknüpfung impliziert eine Abhängigkeit, aber die Abhängigkeit allein reicht nicht aus, wenn Sie eine Verknüpfung herstellen müssen.

2

mit Boost müssen Sie wirklich Paket Finder

set(Boost_ADDITIONAL_VERSIONS "1.46" "1.46.0" "1.46.1") 
    set(Boost_USE_MULTITHREADED ON) # for -mt 
    find_package(Boost COMPONENTS thread) 
    if(Boost_FOUND) 
    MESSAGE(STATUS "Found Boost: ${Boost_LIBRARY_DIRS}") 
    MESSAGE(STATUS "Found Boost libraries: ${Boost_LIBRARIES}") 
    set(LIBRARIES "${LIBRARIES};${Boost_LIBRARIES}") 
    else() 
    MESSAGE(FATAL_ERROR "Boost Thread NOT FOUND") 
    endif() 

target_link_libraries(executable ${LIBRARIES}) 
Verwandte Themen