2017-02-21 47 views
1

Если у меня есть .h и .cpp файлы в каталоге src, где .cpp файлы включают .h файлы, используя эти команды в CMake:CMake + Qt Creator: Добавление файлов заголовков файлов проекта

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?

ответ

0

Я добавляю файлы заголовков всегда в явном виде, чтобы не удивляться. Но на 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 
) 
+1

'$ {} ИСТОЧНИКОВ' 'против $ {SRC_LIST}' не будет работать. Это две разные переменные. –

+0

@ Torbjörn: Спасибо. Я исправил. –

2

Вы не должны использовать 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)