微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。