Ich habe die folgende Struktur in einem CMake-Projekt:
Project directory
subdirectory X
/include
config.h
/src
myfile.c
CMakeLists.txt for subproject X
subdirectory Y
/include
another.h
with the line:
#include "config.h"
*** and the compiler says it cannot find config.h ***
/src
another.c
with the line
#include "another.h"
CMakeLists.txt for subproject Y
CMakeLists.txt for the project which includes both subprojects
Welche magische Zeile füge ich in welche CMakeLists.txt-Datei ein, damit eine andere.c/.h config.h findet? Ich habe ungefähr eine Million verschiedene Dinge ausprobiert, einschließlich Variationen mit {$CMAKE_SOURCE_DIR} und {$CMAKE_CURRENT_SOURCE_DIR}. Bitte helfen Sie, danke.
Lösung des Problems
Bei modernem CMake ist der Begriff eines Unterverzeichnisses / Unterprojekts eine unabhängige Bibliothek / ausführbare Datei. Jedes Unterprojekt (lib / exe) sollte einen Satz von PUBLIC / PRIVATE-Headern definieren. Siehe - https://cmake.org/cmake/help/latest/command/target_include_directories.html. Restabhängige Projekte sollten nur mit Unterprojektbibliotheken verknüpft werden. Die Einbeziehung von Bibliotheken wird intern von CMake verwaltet.
Beispiel-Build-Dateien -
CMakeLists.txt der obersten Ebene
cmake_minimum_required(VERSION 3.9)
project(hello_world)
subdirs(x)
add_executable(hello main.cpp)
target_link_libraries(hello x)
install(TARGETS hello DESTINATION bin)
Subdir / Submodul CMakeLists.txt
cmake_minimum_required(VERSION 3.9)
add_library(x src/x.cpp)
target_include_directories(one PUBLIC include)
target_include_directories(one PRIVATE src)
Belassen Sie als Best Practice alle x
exponierten Header Ihres Moduls bei x/include/x/
. Dadurch werden sie importiert #include "x/Config.h"
und stehen nicht in Konflikt mit anderen Modulen (z. B. y/Config.h
)
Keine Kommentare:
Kommentar veröffentlichen