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?

Author: Peter Mortensen, 2012-12-04

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})
 178
Author: SirDarius,
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
)
 48
Author: Angew,
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ć.

  1. 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.

  2. 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:

  1. 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.

  2. Podobna odpowiedź jest z innymi parami komend target_compile_definitions/add_definitions, target_compile_options/CMAKE_C_FLAGS

 6
Author: bruziuz,
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.
 1
Author: Seyed Hussein Mirzaki,
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