Использование библиотеки Robotcontrol в узле ROS на Beagle Bone Blue - PullRequest
0 голосов
/ 23 октября 2019

Я пытаюсь скомпилировать узел ROS, где использование заголовка robotcontrol в качестве внешнего "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'

Я попытался несколькими способами включить двоичный файл библиотеки в мой файл CMakeLists, которыйЯ компилирую, используя catkin_make. Кто-нибудь ранее использовал код C (как двоичный, а не из исходного кода) в узле ROS? Возможно, я пропускаю знания по 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)]);

Сам код работает, когда я использую его просто какС кодом. Но мне нужно включить его в узел 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 на данный момент выглядит следующим образом (без явной ссылки на библиотеку 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})

Я попытался включить lib в свои CMakeLists с

add_executable(robotcontrol /usr/lib/robotcontrol)

, который, однако, ожидает исходный файл

Я попробовал несколько способов

target_link_libraries(...)

Честно говоря, я пробовал столько версий, которые не знаю, какие именно, и я знаю, что это делает помощь вам, ребята, гораздо труднее. Поэтому я продолжаю пытаться собирать их.

...