2015-02-07 5 views
25

Я использую QtCreator для открытия проекта CMake. Некоторые каталоги, кроме CMakeLists.txt, содержат только файлы заголовков * .h, и для этих каталогов QtCreator в дереве проекта отображается только CMakeLists.txt. Как это исправить? Мне нужно увидеть все файлы проекта из QtCreator.Проект QtCreator CMake - как показать все файлы проекта

ответ

22

Просмотр проекта как файловой системы не является решением, потому что настройки редактора проекта, например, не будут применяться. И я не люблю добавлять заголовки к исполняемой цели, потому что они на самом деле не принадлежат. Вы эффективно калечите файл проекта, чтобы хорошо работать с одной конкретной IDE ... не хорошо. уборщик вариант ИМХО будет:

FILE(GLOB_RECURSE LibFiles "include/*.hpp") 
add_custom_target(headers SOURCES ${LibFiles}) 

В качестве бонуса вы получите свой включает показано в отдельной папке. (заимствовано от https://cmake.org/pipermail/cmake/2012-August/051811.html)

8

Я предлагаю вам переключить вид вашего проекта на Файловую систему. Это будет отображать представление, где вы можете просмотреть любой файл, который вы хотите:

enter image description here

Вы могли бы хотеть, чтобы разделить представление проекта на два, нажав второй по правой кнопке, если вы все еще желаете режим Projects.

+0

Хорошо, но какая инструкция в файлах CMake приводит к тому, что файлы видны в представлении древовидной структуры проекта? – Irbis

+0

Я не уверен, но есть декларации в CMake, указывающие исходный код, вероятно, добавьте ограничение на то, что отображается в дереве проекта. некоторые строения я сомневаюсь в том, что сам QtCreator. –

+4

К сожалению, просмотр файла является плоским и, следовательно, не является достаточной заменой для представления проекта. – Zulan

7

Вы должны добавить файлы заголовков в список ваших исходных файлов: add_executable(${Executable} ${Sources} ${headers})

Вы можете использовать GLOB_RECURSE, если есть много файлов заголовков:

FILE(GLOB_RECURSE INC_ALL "headers/*.h") 
include_directories("headers") 
add_executable(main "main.cpp" ${INC_ALL}) 

Не забудьте снова запустить CMake (Build> Run Cmake).

+2

[CMake официально не рекомендует] (https://cmake.org/cmake/help/latest/command/file.html), подталкивая ваши источники, потому что CMake тогда не сможет обнаружить когда он должен восстанавливаться на основе добавленных, удаленных или переименованных файлов. –

1

Вы можете попробовать CMakeProjectManager2. Код для отображения всех файлов, уже распространенных в восходящем потоке, в качестве доказательства концепции. Применяемая концепция, но код не может быть применен как-то по некоторым причинам. Таким образом, простая функция ожидания в восходящем потоке.

1

На основании другой темы, задающей тот же вопрос, я нашел общее решение проблемы, работая для всех IDE (по крайней мере, протестированных с QtCreator и Visual Studio).

можно найти здесь: https://github.com/sauter-hq/cmake-ide-support

# \brief adds for the given target a fake executable targets which allows all 
#  headers and symbols to be shown in IDEs. 
# \param target_name Which target properties should be added to the IDE support target. 
function(target_add_ide_support target_name) 
    if (NOT TARGET ${target_name}) 
    message(FATAL_ERROR "No target defined with name ${target_name}, cannot target_add_ide_support it.") 
    endif() 

    set (target_for_ide "${target_name}_ide_support") 
    if (NOT TARGET ${target_for_ide}) 
     file(GLOB_RECURSE target_for_ide_srcs "*.h" "*.hpp" "*.hxx" "*.c" "*.cpp" "*.cxx") 
     add_executable(${target_for_ide} ${target_for_ide_srcs}) 
     set_target_properties(${target_for_ide} PROPERTIES EXCLUDE_FROM_ALL 1 EXCLUDE_FROM_DEFAULT_BUILD 1) 
    endif() 

    get_target_property(dirs ${target_name} INCLUDE_DIRECTORIES) 
    target_include_directories(${target_for_ide} PRIVATE ${dirs}) 

endfunction(target_add_ide_support) 

Использование тогда для любых целей в CMakeLists, добавьте следующий вызов (может быть сделано в самой верхней CMakeLists.txt после всех add_subdirectory:

include(add_ide_support.cmake) 
target_add_ide_support(some-target) 
+1

У меня возникла проблема с принятым решением, которое не могло найти некоторые внешние заголовки (из библиотеки PCL Pointcloud) в файлах заголовков моего собственного проекта. Вместо этого этот подход разрешил проблему. – mikkola

Смежные вопросы