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:自动完成的主要内容,如果未能解决你的问题,请参考以下文章
qtserialport 与 qtcreator-ros-plugin 中的 CMake?