ROS/catkin编译的C++文件找不到图片源

问题描述

我创建了一个 C++ 游戏,它使用同一父目录中文件夹中的图像。

/game_folder
----/Images
--------icon1.png
--------icon2.png
----game.cpp

程序使用 Allegro 5 库来包含图像:

ALLEGRO_BITMAP* icon1 = al_load_bitmap("Images/icon1.png");
ALLEGRO_BITMAP* icon2 = al_load_bitmap("Images/icon2.png");

这很好用。

但是现在我需要将此程序放入 ROS/catkin 包“beginner_tutorials”中。如果我将 Images 文件夹和 game.cpp 都放在 ../catkin_ws/src/beginner_tutorials 中,它使用 catkin make 编译得很好,但我在运行时得到 Segmentation Fault

/catkin_ws/src/beginner_tutorials
----/Images
--------icon1.png
--------icon2.png
----game.cpp

我使用 gdb 并猜测错误是由程序未找到 Images 文件夹引起的。

我也尝试将 Images 文件夹放到 ../catkin_ws/devel/include/beginner_tutorials(包含头文件的同一个位置)

/catkin_ws
----/devel/include/beginner_tutorials
--------/Images
------------icon1.png
------------icon2.png
----/src/beginner_tutorials
--------game.cpp

并相应地更改代码

ALLEGRO_BITMAP* icon1 = al_load_bitmap("beginner_tutorials/Images/icon1.png");
ALLEGRO_BITMAP* icon2 = al_load_bitmap("beginner_tutorials/Images/icon2.png");

但这没有用。 我应该将 Image 文件夹放在哪里才能成功包含在代码中?我是否还需要在 CMakeLists.txt 中进行调整?

-编辑
用 CMakeLists.txt 尝试了一些但没有成功:

set(game_SOURCES
  src/game.cpp
  src/Images/
)

add_executable(game ${game_SOURCES})
target_link_libraries(game ${allegro_LIBS})

解决方法

这不起作用的原因是您的代码得到编译,然后放置在catkin_ws/devel/lib/<package_name>文件夹lib而不是{ {1}}!)。然后,当您启动代码时,它只会在相对于可执行文件的路径中查找。这意味着您实际上必须将它放在 include 文件夹中。这样做的问题是,一旦您清理了工作区,所有这些目录都将被删除,并且您必须在每个 catkin_ws/devel/lib/<package_name> 之后将所有文件重新复制到其中。

为此,ROS C++ API 具有允许您浏览 catkin clean 文件夹内给定包的文件夹或在 including the header file ros/package.h 时显示所有可用包的功能:

catkin_ws/src

应该可以解决问题。这将使代码在 #include <ros/package.h> // ... std::string const package_path = ros::package::getPath("beginner_tutorials"); ALLEGRO_BITMAP* icon1 = al_load_bitmap(package_path + "/Images/icon1.png"); ALLEGRO_BITMAP* icon2 = al_load_bitmap(package_path + "/Images/icon2.png"); 路径中查找。

类似在 Python 中的语法是:

catkin_ws/src/beginner_tutorials