在 Beagle Bone Blue 上的 ROS 节点中使用 Robotcontrol 库
Using Robotcontrol library in ROS node on Beagle Bone Blue
我正在尝试编译一个 ROS 节点,其中使用 robotcontrol header 作为 extern "C" 包含在我的 C++ 代码中。
编译失败,找不到对我使用的 robotcontrol 库的几个函数的引用(例如:)
mspeed.cpp:(.text+0x798): undefined reference to `rc_uart_write'
mspeed.cpp:(.text+0x7ba): undefined reference to `rc_uart_flush'
mspeed.cpp:(.text+0x7ce): undefined reference to `rc_uart_write'
我尝试了几种方法将库二进制文件包含在我使用 catkin_make 编译的 CMakeLists 文件中。
以前有人在 ROS 节点中使用过 C 代码(不是源代码的二进制文件)吗?可能是我泄露了 C 和 C++ 方面的知识,或者一般使用 cmake 进行编译,所以我很乐意提供任何建议。
到目前为止我发现的所有内容都使用了原始 c 文件。
这就是我包含库的方式:
#ifdef __cplusplus
extern "C"
{
#endif
#include <robotcontrol.h> // includes ALL Robot Control subsystems
#ifdef __cplusplus
}
#endif
然后我像这里一样调用函数:
rc_uart_write(bus, (uint8_t*)data[bus2mem(bus)], data_count[bus2mem(bus)]);
当我将它用作 C 代码时,代码本身就可以工作。但我需要将它包含到 ROS 节点中。 要编译纯 C 版本 我有另一个 Makefile 随 robotcontrol 库一起提供。我是否需要为我的解决方案提供一些其他编译标志?:
# This is a general use makefile for librobotcontrol projects written in C.
# Just change the target name to match your main source code filename.
TARGET = driver_communication
# compiler and linker binaries
CC := gcc
LINKER := gcc
# compiler and linker flags
WFLAGS := -Wall -Wextra -Werror=float-equal -Wuninitialized -Wunused-variable -Wdouble-promotion
CFLAGS := -g -c -Wall
LDFLAGS := -pthread -lm -lrt -l:librobotcontrol.so.1
SOURCES := $(wildcard *.c)
INCLUDES := $(wildcard *.h)
OBJECTS := $(SOURCES:$%.c=$%.o)
prefix := /usr/local
RM := rm -f
INSTALL := install -m 4755
INSTALLDIR := install -d -m 755
SYMLINK := ln -s -f
SYMLINKDIR := /etc/robotcontrol
SYMLINKNAME := link_to_startup_program
# linking Objects
$(TARGET): $(OBJECTS)
@$(LINKER) -o $@ $(OBJECTS) $(LDFLAGS)
@echo "Made: $@"
# compiling command
$(OBJECTS): %.o : %.c $(INCLUDES)
@$(CC) $(CFLAGS) $(WFLAGS) $(DEBUGFLAG) $< -o $@
@echo "Compiled: $@"
all: $(TARGET)
debug:
$(MAKE) $(MAKEFILE) DEBUGFLAG="-g -D DEBUG"
@echo " "
@echo "$(TARGET) Make Debug Complete"
@echo " "
install:
@$(MAKE) --no-print-directory
@$(INSTALLDIR) $(DESTDIR)$(prefix)/bin
@$(INSTALL) $(TARGET) $(DESTDIR)$(prefix)/bin
@echo "$(TARGET) Install Complete"
clean:
@$(RM) $(OBJECTS)
@$(RM) $(TARGET)
@echo "$(TARGET) Clean Complete"
uninstall:
@$(RM) $(DESTDIR)$(prefix)/bin/$(TARGET)
@echo "$(TARGET) Uninstall Complete"
runonboot:
@$(MAKE) install --no-print-directory
@$(SYMLINK) $(DESTDIR)$(prefix)/bin/$(TARGET) $(SYMLINKDIR)/$(SYMLINKNAME)
@echo "$(TARGET) Set to Run on Boot"
我的 CMakeLists.txt 文件目前看起来像这样(不包括任何 link 到 robotcontrol 库明确:
cmake_minimum_required(VERSION 2.8.3)
project(indoor_navigation)
find_package(catkin REQUIRED COMPONENTS
message_generation
message_runtime
roscpp
rospy
sensor_msgs
std_msgs
)
## Generate messages in the 'msg' folder
add_message_files(
FILES
Directions.msg
)
## Generate added messages and services with any dependencies listed here
generate_messages(
DEPENDENCIES
sensor_msgs
std_msgs
)
catkin_package(
LIBRARIES indoor_navigation
)
## Specify additional locations of header files
## Your package locations should be listed before other locations
include_directories(
# include
${catkin_INCLUDE_DIRS}
)
add_executable(directions src/directions.cpp)
add_executable(mspeed src/mspeed.cpp)
add_dependencies(directions ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
add_dependencies(directions ${PROJECT_NAME}_gencfg)
add_dependencies(directions ${PROJECT_NAME}_generate_messages_cpp)
add_dependencies(mspeed ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
add_dependencies(mspeed ${PROJECT_NAME}_gencfg)
add_dependencies(mspeed ${PROJECT_NAME}_generate_messages_cpp)
target_link_libraries(directions ${catkin_LIBRARIES})
target_link_libraries(mspeed ${catkin_LIBRARIES})
我试图将库包含在我的 CMakeLists 中
add_executable(robotcontrol /usr/lib/robotcontrol)
但是需要源文件
我尝试了几种方法
target_link_libraries(...)
老实说,我尝试了很多版本,但我不知道是哪个版本,我知道这会让对你们的帮助变得更加困难。所以我一直在努力收集这些。
感谢支持。基本上我对 linking 过程有一个误解。
必须先添加库,这可以使用现有的共享对象文件来完成:
add_library(librobotcontrol SHARED IMPORTED GLOBAL)
set_target_properties(librobotcontrol PROPERTIES IMPORTED_LOCATION /usr/lib/librobotcontrol.so)
到目前为止一切顺利...现在剩下要做的就是 link 我想在其中使用该库的文件,与我的典型库 plus 新增的:
target_link_libraries(mspeed ${catkin_LIBRARIES} robotcontrol)
我正在尝试编译一个 ROS 节点,其中使用 robotcontrol header 作为 extern "C" 包含在我的 C++ 代码中。 编译失败,找不到对我使用的 robotcontrol 库的几个函数的引用(例如:)
mspeed.cpp:(.text+0x798): undefined reference to `rc_uart_write'
mspeed.cpp:(.text+0x7ba): undefined reference to `rc_uart_flush'
mspeed.cpp:(.text+0x7ce): undefined reference to `rc_uart_write'
我尝试了几种方法将库二进制文件包含在我使用 catkin_make 编译的 CMakeLists 文件中。 以前有人在 ROS 节点中使用过 C 代码(不是源代码的二进制文件)吗?可能是我泄露了 C 和 C++ 方面的知识,或者一般使用 cmake 进行编译,所以我很乐意提供任何建议。
到目前为止我发现的所有内容都使用了原始 c 文件。
这就是我包含库的方式:
#ifdef __cplusplus
extern "C"
{
#endif
#include <robotcontrol.h> // includes ALL Robot Control subsystems
#ifdef __cplusplus
}
#endif
然后我像这里一样调用函数:
rc_uart_write(bus, (uint8_t*)data[bus2mem(bus)], data_count[bus2mem(bus)]);
当我将它用作 C 代码时,代码本身就可以工作。但我需要将它包含到 ROS 节点中。 要编译纯 C 版本 我有另一个 Makefile 随 robotcontrol 库一起提供。我是否需要为我的解决方案提供一些其他编译标志?:
# This is a general use makefile for librobotcontrol projects written in C.
# Just change the target name to match your main source code filename.
TARGET = driver_communication
# compiler and linker binaries
CC := gcc
LINKER := gcc
# compiler and linker flags
WFLAGS := -Wall -Wextra -Werror=float-equal -Wuninitialized -Wunused-variable -Wdouble-promotion
CFLAGS := -g -c -Wall
LDFLAGS := -pthread -lm -lrt -l:librobotcontrol.so.1
SOURCES := $(wildcard *.c)
INCLUDES := $(wildcard *.h)
OBJECTS := $(SOURCES:$%.c=$%.o)
prefix := /usr/local
RM := rm -f
INSTALL := install -m 4755
INSTALLDIR := install -d -m 755
SYMLINK := ln -s -f
SYMLINKDIR := /etc/robotcontrol
SYMLINKNAME := link_to_startup_program
# linking Objects
$(TARGET): $(OBJECTS)
@$(LINKER) -o $@ $(OBJECTS) $(LDFLAGS)
@echo "Made: $@"
# compiling command
$(OBJECTS): %.o : %.c $(INCLUDES)
@$(CC) $(CFLAGS) $(WFLAGS) $(DEBUGFLAG) $< -o $@
@echo "Compiled: $@"
all: $(TARGET)
debug:
$(MAKE) $(MAKEFILE) DEBUGFLAG="-g -D DEBUG"
@echo " "
@echo "$(TARGET) Make Debug Complete"
@echo " "
install:
@$(MAKE) --no-print-directory
@$(INSTALLDIR) $(DESTDIR)$(prefix)/bin
@$(INSTALL) $(TARGET) $(DESTDIR)$(prefix)/bin
@echo "$(TARGET) Install Complete"
clean:
@$(RM) $(OBJECTS)
@$(RM) $(TARGET)
@echo "$(TARGET) Clean Complete"
uninstall:
@$(RM) $(DESTDIR)$(prefix)/bin/$(TARGET)
@echo "$(TARGET) Uninstall Complete"
runonboot:
@$(MAKE) install --no-print-directory
@$(SYMLINK) $(DESTDIR)$(prefix)/bin/$(TARGET) $(SYMLINKDIR)/$(SYMLINKNAME)
@echo "$(TARGET) Set to Run on Boot"
我的 CMakeLists.txt 文件目前看起来像这样(不包括任何 link 到 robotcontrol 库明确:
cmake_minimum_required(VERSION 2.8.3)
project(indoor_navigation)
find_package(catkin REQUIRED COMPONENTS
message_generation
message_runtime
roscpp
rospy
sensor_msgs
std_msgs
)
## Generate messages in the 'msg' folder
add_message_files(
FILES
Directions.msg
)
## Generate added messages and services with any dependencies listed here
generate_messages(
DEPENDENCIES
sensor_msgs
std_msgs
)
catkin_package(
LIBRARIES indoor_navigation
)
## Specify additional locations of header files
## Your package locations should be listed before other locations
include_directories(
# include
${catkin_INCLUDE_DIRS}
)
add_executable(directions src/directions.cpp)
add_executable(mspeed src/mspeed.cpp)
add_dependencies(directions ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
add_dependencies(directions ${PROJECT_NAME}_gencfg)
add_dependencies(directions ${PROJECT_NAME}_generate_messages_cpp)
add_dependencies(mspeed ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
add_dependencies(mspeed ${PROJECT_NAME}_gencfg)
add_dependencies(mspeed ${PROJECT_NAME}_generate_messages_cpp)
target_link_libraries(directions ${catkin_LIBRARIES})
target_link_libraries(mspeed ${catkin_LIBRARIES})
我试图将库包含在我的 CMakeLists 中
add_executable(robotcontrol /usr/lib/robotcontrol)
但是需要源文件
我尝试了几种方法
target_link_libraries(...)
老实说,我尝试了很多版本,但我不知道是哪个版本,我知道这会让对你们的帮助变得更加困难。所以我一直在努力收集这些。
感谢支持。基本上我对 linking 过程有一个误解。 必须先添加库,这可以使用现有的共享对象文件来完成:
add_library(librobotcontrol SHARED IMPORTED GLOBAL)
set_target_properties(librobotcontrol PROPERTIES IMPORTED_LOCATION /usr/lib/librobotcontrol.so)
到目前为止一切顺利...现在剩下要做的就是 link 我想在其中使用该库的文件,与我的典型库 plus 新增的:
target_link_libraries(mspeed ${catkin_LIBRARIES} robotcontrol)