Я использую и люблю 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
и там мое решение с библиотекой больше не работает.
Кто-нибудь знает другое решение ?!
Обновить: Это решение НЕ работает с QtCreator 3.6
Я нашел решение своего собственного вопроса. Не так весело, но в любом случае, я потратил много времени на эту проблему, поэтому вот решение, которое, надеюсь, пригодится другим:
Автозаполнение CMakeLists.txt в QtCreator 3.5.1 для ваших собственных классов:
ADD_LIBRARY(myFilesLib src/class1.cpp ...)
add_executable(${PROJECT_NAME} src/main.cpp)
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
)
Я не знаю, почему он работает только с библиотекой, но работает. Может, у кого-нибудь есть объяснение ?!
Это действительно раздражает. Наконец, я нашел решение, которое работает на Qt Creator 4.1.0 и, вероятно, работает на других версиях.
include_directories
правильно, так что компиляция в порядке.Ниже include_directories
, добавьте следующую строку. Обратите внимание, что последовательность имеет значение, следующая строка должна располагаться ниже include_directories
,
file(GLOB_RECURSE HEADERS */*.hpp */*.h)
добавлять ${HEADERS} # for qtcreator...
в одном из ваших add_executable
, лайк:
add_executable(slam_pp_node
${HEADERS} # for qtcreator...
src/***.cpp
)
Сказанного должно быть достаточно для решения проблемы автозаполнения. Если нет, добавьте следующие строки в конец вашего CMakeList.txt:
file(GLOB_RECURSE EXTRA_FILES */*)
add_custom_target(${PROJECT_NAME}_OTHER_FILES ALL WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} SOURCES ${EXTRA_FILES})
Удачи!