ROS с QtCreator: автозаполнение

Я использую и люблю QtCreator для написания кода и сборки моих проектов ROS, написанных на C ++.

К сожалению автозаполнение для моих собственных заголовочных файлов не работает: например #include "LineTracker.hh"

Сборка проекта работает отлично. А также работает автозаполнение для других внешних пакетов, таких как ros или opencv.

Обновление 2.0: С QtCreator 3.6 решение не работает

Обновление 1.0: Нашел решение, смотри снизу!

Вот как выглядит мой CMakeLists.txt:

cmake_minimum_required(VERSION 2.8.3)
project(line_tracking)

SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

find_package(catkin REQUIRED COMPONENTS
roscpp
tf
sensor_msgs
image_transport
cv_bridge
)

catkin_package()include_directories(
include
${catkin_INCLUDE_DIRS}
${PROJECT_SOURCE_DIR}
)add_executable(${PROJECT_NAME}
src/line_tracking.cpp
src/EDLineDetector.cpp
src/LineTracker.cpp
)

target_link_libraries(${PROJECT_NAME}
${catkin_LIBRARIES}
)

# --- QT CREATOR STUFF ---

#Add all files in subdirectories of the project in
# a dummy_target so qtcreator has access to all files
FILE(GLOB children ${CMAKE_SOURCE_DIR}/*)
FOREACH(child ${children})
IF(IS_DIRECTORY ${child})
file(GLOB_RECURSE dir_files "${child}/*")
LIST(APPEND extra_files ${dir_files})
ENDIF()
ENDFOREACH()
add_custom_target(dummy_${PROJECT_NAME} SOURCES ${extra_files})
#

Структура файла / пакета выглядит следующим образом:

CMakeLists.txt
|
+ -- src
|
+ -- include

Как мне адаптировать мой CMakeLists.txt, чтобы QtCreator находил мои заголовки для автозаполнения?

Большое спасибо за Вашу помощь!

Примечание:

Когда я использую верхний файл CMakeLists.txt рабочей области catkin в QtCeator, и я включаю заголовочные файлы в их путь к пакету следующим образом: #include <packageName/include/headerFile.h> автозаполнение работает, но сборка больше не работает. Так что это только плохой и не удобный для пользователя взлом, чтобы получить авто-завершение во время кодирования.


Обновление 1.0:

Я нашел решение, которое работает:

я создать библиотеку из всех (классов) файлов, которые имеют заголовочные файлы, и связать библиотеку с основным файлом, вместо добавления файлов в качестве исполняемых файлов. Я отправил это Вот как ответ.

Но я не знаю, почему это так работает, и не обходится без библиотеки. Есть объяснения?


Обновление 2.0:
Я только что обновился до QtCreator 3.6 и там мое решение с библиотекой больше не работает.

Кто-нибудь знает другое решение ?!

0

Решение

Обновить: Это решение НЕ работает с QtCreator 3.6


Я нашел решение своего собственного вопроса. Не так весело, но в любом случае, я потратил много времени на эту проблему, поэтому вот решение, которое, надеюсь, пригодится другим:

Автозаполнение CMakeLists.txt в QtCreator 3.5.1 для ваших собственных классов:

  1. Создайте библиотеку со всеми вашими классами: ADD_LIBRARY(myFilesLib src/class1.cpp ...)
  2. Добавьте свой исполняемый файл (основная функция): add_executable(${PROJECT_NAME} src/main.cpp)
  3. Свяжите вашу библиотеку с вашим исполняемым файлом: target_link_libraries(${PROJECT_NAME} myFilesLib)

С этим способом над библиотекой автозаполнение работает в QtCreator!

Для ROS (catkin) не забудьте связать ${catkin_LIBRARIES},

Здесь весь CMakeLists.txt:

cmake_minimum_required(VERSION 2.8.3)
project(example_project)

SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

find_package(catkin REQUIRED COMPONENTS
roscpp
)

catkin_package()

include_directories(
include
${catkin_INCLUDE_DIRS}
${PROJECT_SOURCE_DIR}
)

# Create a library with all your classes
add_library(myFilesLib
src/class1.cpp
src/class2.cpp
src/class3.cpp
)
target_link_libraries(myFilesLib
${catkin_LIBRARIES}
)

# add your executable
add_executable(${PROJECT_NAME}
src/main.cpp
)

# link the library with your classes to the executable
target_link_libraries(${PROJECT_NAME}
${catkin_LIBRARIES}
myFilesLib
)

Я не знаю, почему он работает только с библиотекой, но работает. Может, у кого-нибудь есть объяснение ?!

1

Другие решения

Это действительно раздражает. Наконец, я нашел решение, которое работает на Qt Creator 4.1.0 и, вероятно, работает на других версиях.

  1. Пиши свой include_directories правильно, так что компиляция в порядке.
  2. Ниже include_directories, добавьте следующую строку. Обратите внимание, что последовательность имеет значение, следующая строка должна располагаться ниже include_directories,

    file(GLOB_RECURSE HEADERS */*.hpp */*.h)
    
  3. добавлять ${HEADERS} # for qtcreator... в одном из ваших add_executable, лайк:

    add_executable(slam_pp_node
    ${HEADERS} # for qtcreator...
    src/***.cpp
    )
    
  4. Сказанного должно быть достаточно для решения проблемы автозаполнения. Если нет, добавьте следующие строки в конец вашего CMakeList.txt:

    file(GLOB_RECURSE EXTRA_FILES */*)
    add_custom_target(${PROJECT_NAME}_OTHER_FILES ALL WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} SOURCES ${EXTRA_FILES})
    

Удачи!

1