Jak prawidłowo dodawać katalogi include za pomocą CMake
Jakiś rok temu zapytałem oheader dependencies w CMake .
Zdałem sobie ostatnio sprawę, że wydaje mi się, że CMake uznał te pliki nagłówkowe za zewnętrzne dla projektu. Przynajmniej podczas generowania projektu Code:: Blocks pliki nagłówkowe nie pojawiają się w projekcie (pliki źródłowe tak). Wydaje mi się więc, że CMake uważa te nagłówki za zewnętrzne dla projektu i nie śledzi ich w depends.
A szybkie wyszukiwanie w samouczku CMake wskazuje tylko na include_directories
, które nie wydaje się robić tego, co chcę...
Jaki jest właściwy sposób zasygnalizowania CMake ' owi, że dany katalog zawiera nagłówki, które mają być dołączone i że nagłówki te powinny być śledzone przez wygenerowany plik Makefile?
4 answers
Trzeba zrobić dwie rzeczy.
Najpierw Dodaj katalog, który ma być dołączony:
target_include_directories(test PRIVATE ${YOUR_DIRECTORY})
Jeśli utkniesz z bardzo starą wersją CMake (2.8.10 lub starszą) bez wsparcia dla target_include_directories
, Możesz również użyć legacy include_directories
:
include_directories(${YOUR_DIRECTORY})
Następnie należy dodać pliki nagłówkowe do listy plików źródłowych dla bieżącego celu, na przykład:
set(SOURCES file.cpp file2.cpp ${YOUR_DIRECTORY}/file1.h ${YOUR_DIRECTORY}/file2.h)
add_executable(test ${SOURCES})
W ten sposób pliki nagłówkowe pojawią się jako zależności w pliku Makefile, a także na przykład w wygenerowanym Projekt Visual Studio, jeśli go wygenerujesz.
Jak używać plików nagłówkowych dla kilku celów:
set(HEADER_FILES ${YOUR_DIRECTORY}/file1.h ${YOUR_DIRECTORY}/file2.h)
add_library(mylib libsrc.cpp ${HEADER_FILES})
target_include_directories(mylib PRIVATE ${YOUR_DIRECTORY})
add_executable(myexec execfile.cpp ${HEADER_FILES})
target_include_directories(myexec PRIVATE ${YOUR_DIRECTORY})
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-15 23:07:05
Najpierw używasz include_directories()
, aby powiedzieć CMake, aby dodał katalog jako -I
do linii poleceń kompilacji. Po drugie, wyświetlasz nagłówki w wywołaniu add_executable()
lub add_library()
.
Jako przykład, jeśli Źródła twojego projektu są w src
, A potrzebujesz nagłówków z include
, możesz to zrobić tak:
include_directories(include)
add_executable(MyExec
src/main.c
src/other_source.c
include/header1.h
include/header2.h
)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-15 23:07:46
CMake jest bardziej podobny do języka skryptowego, jeśli porównuje go z innymi sposobami tworzenia pliku Makefile (np. make lub qmake). To nie jest bardzo fajne jak Python, ale nadal.
Nie ma czegoś takiego jak " proper way " Jeśli szukasz w różnych projektach opensource jak ludzie zawierają katalogi. Ale są dwa sposoby, aby to zrobić.
Crude include_directories doda katalog do bieżącego projektu i wszystkich innych projektów potomnych, które zostaną dodane przez seria poleceń add_subdirectory. Czasami ludzie mówią, że takie podejście jest dziedzictwem.
Bardziej eleganckim sposobem jest target_include_directories . Pozwala na dołączenie katalogu dla określonego projektu / celu Bez (być może) niepotrzebnego dziedziczenia lub zderzania różnych katalogów include. Pozwól również wykonać nawet subtelną konfigurację i dodaj jeden z następujących znaczników dla tego polecenia.
PRIVATE - Tylko do użytku dla tego określonego celu budowania
PUBLIC - użyj go dla określonego celu i dla celów, które łączą się z tym projektem
Interfejs -- użyj go tylko dla celów, które łączą się z bieżącym projektem
PS:
Oba polecenia pozwalają oznaczyć katalog jako SYSTEM, aby dać wskazówkę, że to nie Twoja firma, że określone katalogi będą zawierać ostrzeżenia.
Podobna odpowiedź jest z innymi parami komend target_compile_definitions/add_definitions, target_compile_options/CMAKE_C_FLAGS
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-15 23:13:15
Miałem ten sam problem.
Mój katalog projektu wyglądał tak:
--project
---Classes
----Application
-----.h and .c files
----OtherFolders
--main.cpp
I to co kiedyś dodałem do tych wszystkich folderów:
file(GLOB source_files
"*.h"
"*.cpp"
"Classes/*/*.cpp"
"Classes/*/*.h"
)
add_executable(Server ${source_files})
I zadziałało.Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-15 23:13:49