CMake + Qt Creator: добавление заголовочных файлов в файлы проекта
Если у меня есть .h
а также .cpp
файлы в каталоге src
, где .cpp
файлы включают .h
файлы, используя эти команды в CMake:
aux_source_directory(src SRC_LIST)
add_executable(${PROJECT_NAME} ${SRC_LIST})
И, открыв этот файл CMake в Qt Creator, вы получите все файлы (источники + заголовки) в списке файлов проекта (по умолчанию дерево файлов слева).
Теперь, с другой стороны, если я положу все .h
файлы в каталоге include
и используйте это:
include_directories(include)
aux_source_directory(src SRC_LIST)
add_executable(${PROJECT_NAME} ${SRC_LIST})
Заголовочные файлы исчезают из файлов проекта!
Как я могу сохранить файлы заголовков в этом каталоге и при этом сохранить их в файлах проекта Qt Creator?
2 ответа
Я добавляю свои заголовочные файлы всегда в явном виде, чтобы избежать какого-либо удивления. Но на MacOS с использованием QtCreator 4.2.0 и cmake 3.7.1 я не могу воспроизвести вашу проблему.
Однако я рекомендую использовать следующую структуру, чтобы знать, какие файлы находятся в проекте, и запускать обновление данных cmake во время обновления CMakeLists.txt.
В проекте /CMakeLists.txt:
add_subdirectory(src)
include_directory(include)
add_executable(foo ${SRC_LIST})
В проекте /src/CMakeLists.txt:
set(SRC_LIST
${SRC_LIST}
${CMAKE_CURRENT_SOURCE_DIR}/a.cpp
${CMAKE_CURRENT_SOURCE_DIR}/b.cpp
PARENT_SCOPE
)
Вы не должны использовать aux_source_directory()
для вашей задачи. Эта команда для чего-то другого. Просто перечислите исходные файлы (или поместите их в переменную).
Вы не должны использовать include_directory()
для определения включить каталоги больше. Эта команда просто заполнит -I
флаг компилятора. Определите переменную с заголовочными файлами и добавьте ее в исполняемый файл.
Если вы не хотите перечислять каждый файл вручную, используйте file(GLOB ...)
, Но помните о предостережениях, часто упоминаемых во всем Интернете с помощью этой команды.
После этого скажите CMake для заполнения -I
флаг только для этого исполняемого файла с include
каталог. Таким образом, другие цели не загрязняются включениями, они не должны использоваться.
set(SOURCES
src/main.cpp
src/whatever.cpp)
set(HEADERS
include/whatever.h)
add_executable(${PROJECT_NAME} ${SOURCES} ${HEADERS})
target_include_directories(${PROJECT_NAME} PUBLIC include)