GOOGLE ADS

Freitag, 22. April 2022

CMake hat ein Problem beim Finden einer Include-Datei in einem anderen Unterprojekt

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 xexponierten 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

Warum werden SCHED_FIFO-Threads derselben physischen CPU zugewiesen, obwohl CPUs im Leerlauf verfügbar sind?

Lösung des Problems Wenn ich das richtig verstehe, versuchen Sie, SCHED_FIFO mit aktiviertem Hyperthreading ("HT") zu verwenden, ...