ROS 与 QtCreator:自动完成

Posted

技术标签:

【中文标题】ROS 与 QtCreator:自动完成【英文标题】:ROS with QtCreator: autocompletion 【发布时间】:2016-01-18 03:08:07 【问题描述】:

我正在使用和喜欢 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:

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

从所有具有头文件的(类)文件创建一个库,并将该库链接到主文件,而不是将文件添加为可执行文件。我将其发布为here 作为答案。

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


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

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

【问题讨论】:

尝试将 $roscpp_INCLUDE_DIRS 添加到 include_directories 命令中。此外,在获取 ros 和你的工作空间的设置文件之后,你是否从命令行运行 qtcreator?您可能还需要将 $roscpp_LIBRARIES 添加到 target_link_library 命令 我试过但没有帮助。 $roscpp_INCLUDE_DIRS 指向与$catkin_INCLUDE_DIRS 相同(但更少)的目录。这些是 ROS 特定的目录,自动完成在其中工作。我正在从命令行运行 QtCreator。 你是在导入项目后从qtcreator运行cmake的吗? 是的,我做到了!但现在我找到了解决方案。请参阅我更新的问题。 【参考方案1】:

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


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

在 QtCreator 3.5.1 中使用 CMakeLists.txt 为您自己的类自动完成

    创建一个包含所有类的库: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
)

我不知道为什么它只能通过图书馆的方式工作,但它正在工作。也许有人有解释?!

【讨论】:

【参考方案2】:

这真的很烦人。最后我想出了一个解决方案,它适用于 Qt Creator 4.1.0,并且可能适用于其他版本。

    正确写include_directories,这样编译就OK了。

    include_directories 下方,添加以下行。请注意,顺序很重要,以下行必须位于include_directories 下方。

    file(GLOB_RECURSE HEADERS */*.hpp */*.h)
    

    在您的add_executable 之一中添加$HEADERS # for qtcreator...。喜欢:

    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)
    

祝你好运!

【讨论】:

以上是关于ROS 与 QtCreator:自动完成的主要内容,如果未能解决你的问题,请参考以下文章

在哪里告诉 Qt Creator 搜索用于自动完成的头文件

ROS:使用Qt Creator创建GUI程序

蓝桥ROS之半自动贪吃龟turtlesim版

qtserialport 与 qtcreator-ros-plugin 中的 CMake?

Ajax 自动完成(或自动建议)与 TAB 完成/自动填充类似于 shell 命令行完成?

jQuery UI 自动完成与类似 Chrome 的自动填充