Około rok temu zapytałem o zależności nagłówka w CMake .
Ostatnio zdałem sobie sprawę, że wydaje się, że problem polega na tym, ż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 (tak jak pliki źródłowe). Dlatego wydaje mi się, że CMake uważa te nagłówki za zewnętrzne dla projektu i nie śledzi ich w zależności.
Szybkie wyszukiwanie w samouczku CMake wskazało tylko, include_directories
które nie wydają się robić tego, co chciałbym ...
Jaki jest właściwy sposób zasygnalizowania CMake, że określony katalog zawiera nagłówki, które należy uwzględnić, i że nagłówki te powinny być śledzone przez wygenerowany plik Makefile?
.cbp
pliku projektu. Teraz, jeśli skaner zależności cmake nie rozpozna poprawnie pliku nagłówka jako zależności dla pliku Makefile, istnieją sposoby, aby to naprawić, ale w niektórych przypadkach może to być błędne, ponieważ nie zawiera pełnego preprocesora.Odpowiedzi:
Dwie rzeczy muszą być zrobione.
Najpierw dodaj katalog, który chcesz dołączyć:
Jeśli utkniesz z bardzo starą wersją CMake (2.8.10 lub starszą) bez wsparcia
target_include_directories
, możesz również użyć starszej wersjiinclude_directories
:Następnie musisz również dodać pliki nagłówkowe do listy plików źródłowych dla bieżącego celu, na przykład:
W ten sposób pliki nagłówkowe pojawią się jako zależności w pliku Makefile, a także na przykład w wygenerowanym projekcie Visual Studio, jeśli go wygenerujesz.
Jak korzystać z tych plików nagłówkowych dla kilku celów:
źródło
LIBROOT_HEADER_FILES
zmiennej w,liba/CMakefile
alibb/CMakefile
następnie?include_directories
overtarget_include_directories
. Ten pierwszy ustawia go rekurencyjnie dla wszystkich celów w tym katalogu; podczas gdy ten drugi wyznacza cel. Wykonanie pierwszego z nich łamie pojęcie grafu docelowego w CMake i zamiast tego opiera się na skutkach ubocznych w hierarchii plików.target_include_directories
nowoczesnego kodu CMake. Jeśli nie zgadzasz się ze zmianami, zaproś mnie na czat.Po pierwsze,
include_directories()
mówisz CMake, aby dodała katalog-I
do wiersza poleceń kompilacji. Po drugie, wypisujesz nagłówki w swoimadd_executable()
lubadd_library()
wywołaniu.Na przykład, jeśli źródła twojego projektu są włączone
src
i potrzebujesz nagłówków zinclude
, możesz to zrobić w następujący sposób:źródło
add_executable
? Myślałem, że CMake automatycznie zorientował się, jakie są zależności plików dołączanych.CMake jest bardziej jak język skryptowy, jeśli porównuje się go z innymi sposobami tworzenia Makefile (np. Make lub qmake). Nie jest tak fajny jak Python, ale nadal.
Nie ma czegoś takiego jak „ właściwy sposób ”, jeśli w różnych projektach typu open source ludzie uwzględniają katalogi. Ale są na to dwa sposoby.
Surowe katalog_włączenia doda katalog do bieżącego projektu i wszystkich innych projektów potomnych, które dodasz za pomocą szeregu poleceń add_subdirectory . Czasami ludzie mówią, że takie podejście jest dziedzictwem.
Bardziej elegancki jest sposób z target_include_directories . Pozwala dołączyć katalog do konkretnego projektu / celu bez (być może) niepotrzebnego dziedziczenia lub kolizji różnych katalogów dołączanych. Pozwól także na wykonanie nawet subtelnej konfiguracji i dodaj jeden z następujących znaczników do tego polecenia.
PRYWATNE - użyj tylko dla tego określonego celu kompilacji
PUBLICZNY - użyj go dla określonego celu i celów, które łączą się z tym projektem
BERŁO - używaj go tylko do celów, które łączą się z bieżącym projektem
PS:
Obie komendy pozwalają oznaczyć katalog jako SYSTEM, dając do zrozumienia, że to nie twoja firma zawiera określone ostrzeżenia.
Podobna odpowiedź jest z innymi parami poleceń target_compile_definitions / add_definitions , target_compile_options / CMAKE_C_FLAGS
źródło
Dodaj
include_directories("/your/path/here")
.Będzie to podobne do dzwonienia
gcc
z-I/your/path/here/
opcją.Upewnij się, że umieściłeś podwójne cudzysłowy wokół ścieżki. Inni o tym nie wspominali i utknąłem na 2 dni. Ta odpowiedź jest więc dla osób, które są nowe w CMake i bardzo zdezorientowane.
źródło
Miałem ten sam problem.
Mój katalog projektów wyglądał tak:
I to, co zwykłem umieszczać pliki we wszystkich tych folderach:
I to całkowicie zadziałało.
źródło