Ошибка поиска символа в контейнере Docker - PullRequest
0 голосов
/ 14 февраля 2020

Я скомпилировал gRP C библиотеку и включил в мои CMakeLists. У меня также есть исполняемый файл, который использует gRP C для запуска. Итак, во-первых, я попытался скомпилировать и запустить свой код на моей локальной машине, и все работает как положено. Вот некоторые важные части моих списков CMakeList, чтобы вы могли понять, что я делаю:

Сначала я нахожу gRP C и задаю имя _GRPC_GRPCPP_UNSECURE

find_package(gRPC CONFIG REQUIRED)
message(STATUS "Using gRPC ${gRPC_VERSION}")

set(_GRPC_GRPCPP_UNSECURE gRPC::grpc++)

Здесь gRPC::grpc++ Я считаю, что grpc++.so (поправьте меня, если я ошибаюсь, если кто-то знает эту библиотеку)

После этого в мои CMakeLists я наконец добавляю свой исполняемый файл и ссылку на _GRPC_GRPCPP_UNSECURE и другие такие пакеты, как Protobuf, файлы исходного кода и заголовочных файлов grp c и др. c. (Я думаю, что они не важны, так как моя ошибка исходит от самой библиотеки gRP C):

add_library(sync_slam_toolbox src/slam_toolbox_sync.cpp ${sensor_proto_srcs} ${sensor_grpc_srcs})
target_link_libraries(sync_slam_toolbox toolbox_common karto ${catkin_LIBRARIES} ${Boost_LIBRARIES} ${_GRPC_GRPCPP_UNSECURE} ${_PROTOBUF_LIBPROTOBUF})
add_executable(sync_slam_toolbox_node src/slam_toolbox_sync_node.cpp)
target_link_libraries(sync_slam_toolbox_node sync_slam_toolbox)

Итак, как вы можете видеть, я связываюсь так, как должен, и код работает, как и ожидалось, на моем местная машина.

Теперь, как только я создаю docker изображение и запускаю тот же код внутри созданного контейнера, я получаю следующую ошибку:

/home/abyl/server/ros_ws/devel/lib/slam_toolbox/sync_slam_toolbox_node: symbol lookup error: /home/abyl/server/ros_ws/devel/lib/slam_toolbox/sync_slam_toolbox_node: undefined symbol: _ZN9grpc_impl13ServerBuilderD1Ev

И вывод c++filt _ZN9grpc_impl13ServerBuilderD1Ev это grpc_impl::ServerBuilder::~ServerBuilder(), что означает, что мой компилятор по какой-то причине не связывал библиотеку gRP C. Может ли быть так, что контейнер не может получить доступ к .so? Несмотря на то, что я скомпилировал и установил библиотеку gRP C, как на своей локальной машине, и у CMakeLists не было проблем с ее поиском при создании образа!

Примечание: я использую gRP C 1.27.

...