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)
Другие вопросы по тегам