带有QtCreator的ROS:自动完成

ROS with QtCreator: autocompletion

本文关键字:QtCreator ROS 带有      更新时间:2023-10-16

我正在使用并喜欢QtCreator来编码和构建用c ++编写的ROS项目。

不幸的是,我自己的头文件的自动完成不起作用:例如 #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找到我的标头以进行自动完成?

非常感谢您的帮助!

旁注:

当我在QtCeator中使用catkin工作区的顶级CMakeLists.txt文件时,我将头文件包含在它们的包路径下,如下所示:#include <packageName/include/headerFile.h>自动完成正在工作,但构建不再工作。因此,这只是一个糟糕且不友好的黑客,可以在编码过程中自动完成。


1.0 版本:

我找到了一个有效的解决方案:

从所有具有头文件的(类)文件创建一个库,并将库链接到主文件,而不是将文件添加为可执行文件。我把它贴在这里作为答案。

但我不知道为什么它会这样工作,而不是没有图书馆的方式。有什么解释吗?


更新 2.0:我刚刚升级到QtCreator 3.6,我的解决方案与库不再工作。

有人知道另一种解决方案吗?!

更新:此解决方案不适用于QtCreator 3.6


我找到了解决自己问题的方法。不是那么有趣,但无论如何,我花了很多时间解决这个问题,所以这里是解决方案,希望对其他人有用:

使用 CMakeList 自动完成.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_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,并且可能适用于其他版本。

  1. 正确编写include_directories,以便编译正常。
  2. include_directories下方,添加以下行。请注意,顺序很重要,以下行必须位于include_directories下方。

    file(GLOB_RECURSE HEADERS */*.hpp */*.h)
    
  3. 在其中一个add_executable中添加${HEADERS} # for qtcreator...。 例如:

    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})
    

祝你好运!