0

我正在使用和喜欢 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该库的解决方案,但我的解决方案不再工作了。

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

4

2 回答 2

1

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

  1. 正确写你的include_directories,这样编译就OK了。
  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})
    

祝你好运!

于 2017-01-08T03:35:37.983 回答
1

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


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

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

  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
)

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

于 2016-01-21T03:00:11.530 回答