417 Stimmen

Wie man mit CMake Include-Verzeichnisse richtig hinzufügt

Vor etwa einem Jahr fragte ich nach Header-Abhängigkeiten in CMake .

Vor kurzem habe ich festgestellt, dass das Problem darin zu liegen scheint, dass CMake diese Header-Dateien als extern zu dem Projekt. Zumindest bei der Erstellung eines Code::Blocks-Projekts erscheinen die Header-Dateien nicht im Projekt (die Quelldateien schon). Es scheint mir daher, dass CMake diese Header als extern zum Projekt und verfolgt sie nicht in den Abhängigkeiten.

Eine schnelle Suche im CMake-Tutorial zeigte nur auf include_directories was nicht das zu tun scheint, was ich mir wünsche...

Wie kann man CMake signalisieren, dass ein bestimmtes Verzeichnis Header enthält, die in das Makefile aufgenommen werden sollen, und dass diese Header von dem generierten Makefile verfolgt werden sollen?

10voto

Ich hatte das gleiche Problem.

Mein Projektverzeichnis sah folgendermaßen aus:

    --project
    ---Classes
    ----Application
    -----.h and .c files
    ----OtherFolders
    --main.cpp

Und was ich verwendet habe, um die Dateien in all diesen Ordnern aufzunehmen:

    file(GLOB source_files CONFIGURE_DEPENDS
            "*.h"
            "*.cpp"
            "Classes/*/*.cpp"
            "Classes/*/*.h"
    )

    add_executable(Server ${source_files})

Und es hat absolut funktioniert.

5voto

Victor Mwenda Punkte 1499

Sie haben zwei Möglichkeiten.

Das Alte:

include_directories(${PATH_TO_DIRECTORY})

und die neue

target_include_directories(executable-name PRIVATE ${PATH_TO_DIRECTORY})

Zu verwenden target_include_directories Sie müssen Ihre ausführbare Datei definiert haben - add_executable(executable-name sourcefiles) .

Ihr Code sollte also wie folgt aussehen

add_executable(executable-name sourcefiles)
target_include_directories(executable-name PRIVATE ${PATH_TO_DIRECTORY})

Hier können Sie mehr lesen https://cmake.org/cmake/help/latest/command/target_include_directories.html

1voto

Das hat bei mir funktioniert:

set(SOURCE main.cpp)
add_executable(${PROJECT_NAME} ${SOURCE})

# target_include_directories must be added AFTER add_executable
target_include_directories(${PROJECT_NAME} PUBLIC ${INTERNAL_INCLUDES})

1voto

Cristi Mihai Punkte 44

Vergessen Sie nicht ${CMAKE_CURRENT_LIST_DIR} . Das war es, was mir Probleme bereitet hat.

Das Beispiel sollte folgendermaßen aussehen:

target_include_directories(projectname
    PUBLIC "${CMAKE_CURRENT_LIST_DIR}/include"                          
)

PUBLIC für Abhängigkeiten, die in einem übergeordneten Projekt enthalten sein sollen. PRIVATE für solche, die Sie nicht wollen.

0voto

Top-Master Punkte 5094

In neueren CMake-Versionen können wir unsere Include-Pfade auf das Ziel beschränken, etwa:

target_include_directories(MyApp PRIVATE "${CMAKE_CURRENT_LIST_DIR}/myFolder")

Ich meine, wenn die CMakeLists.txt mehrere Ziele hat, ansonsten werden die Include-Pfade NICHT mit anderen CMakeLists.txt Skripte, und es reicht, wenn man so etwas macht:

include_directories("${CMAKE_CURRENT_LIST_DIR}/myFolder")

Vielleicht können wir aber auch simulieren, was target_include_directories(...) funktioniert für CMake 2.8.10 oder ältere Versionen, wie:

set_property(
    TARGET MyApp
    APPEND PROPERTY
        INCLUDE_DIRECTORIES "${CMAKE_CURRENT_LIST_DIR}/myFolder"
)

Alles erledigt, scheint aber wenn Sie möchten, dass die Quelldateien neu kompiliert werden, sobald eine von ihnen verwendete Header-Datei geändert wird, müssen alle diese Header-Dateien auch zu jedem Ziel hinzugefügt werden, z. B.:

set(SOURCES src/main.cpp)

set(HEADERS
    ${CMAKE_CURRENT_LIST_DIR}/myFolder/myHeaderFile.h
    ${CMAKE_CURRENT_LIST_DIR}/myFolder/myOtherHeader.h
)

add_executable(MyApp ${SOURCES} ${HEADERS})

Wobei ich mit "scheint" meine, dass CMake solche Header-Dateien automatisch erkennen könnte, wenn es wollte, weil es die C/C++-Dateien des Projekts sowieso parst.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X