ROS CPP Snap7 Linux - CMake 不链接 lib 我安装了库:结果:FindLibSnap7.cmake:CMakeLists.txt:catkin_make 输出:lld 输出

如何解决ROS CPP Snap7 Linux - CMake 不链接 lib 我安装了库:结果:FindLibSnap7.cmake:CMakeLists.txt:catkin_make 输出:lld 输出

我想使用Snap7(多平台以太网 S7 PLC 通信套件)在 ROS 和西门子 S7 1500 之间建立通信。

我遇到了链接器问题 - 虽然我可以找到包含和库 .so 文件本身,但使用自定义 FindLibsnap7.cmake,target_link_libraries 没有链接snap7 库。这是我的方法和帮助调试的输出

(注意:目前我们被迫使用 ROS Kinetic,因此使用 snap7 Python 包装器似乎不是一个选项,因为它是用 python3 编写的。)

我安装了库:

  • sudo add-apt-repository ppa:gijzelaar/snap7
  • sudo apt-get update
  • sudo apt-get install libsnap71 libsnap7-dev

结果:

$ ll /usr/lib/libsnap7.so
  -rwxr-xr-x 1 root root 305944 Apr 24 22:18 /usr/lib/libsnap7.so*
$ ll /usr/include/snap7.h
  -rw-r--r-- 1 root root 41954 Jun  2  2015 /usr/include/snap7.h

FindLibsnap7.cmake:

# find libsnap7
#
# exports:
#
#   Libsnap7_FOUND
#   Libsnap7_INCLUDE_Dirs
#   Libsnap7_LIBRARIES
#

find_package(PkgConfig required)

# Use pkg-config to get hints about paths
#pkg_check_modules(Libsnap7_PKGCONF required libsnap7)

# Include dir
find_path(Libsnap7_INCLUDE_DIR
  NAMES snap7.h
  PATHS ${Libsnap7_PKGCONF_INCLUDE_Dirs}
)

find_library(
   Libsnap7_LIBRARY
   NAMES snap7 libsnap7
   PATHS /usr/lib
#   PATH_SUFFIXES lib
#   NO_DEFAULT_PATH
)

#FIND_PACKAGE_HANDLE_STANDARD_ARGS(Libsnap7 DEFAULT_MSG Libsnap7_LIBRARY Libsnap7_INCLUDE_DIR)

message("Libsnap7_INCLUDE_DIR ${Libsnap7_INCLUDE_DIR}")
message("Libsnap7_LIBRARY ${Libsnap7_LIBRARY}")

set(Libsnap7_LIBRARIES ${Libsnap7_LIBRARY})
set(Libsnap7_INCLUDE_Dirs ${Libsnap7_INCLUDE_DIR})
set(Libsnap7_FOUND yes)

# Set the include dir variables and the libraries and let libfind_process do the rest.
# NOTE: Singular variables for this library,plural for libraries this this lib depends on.
#set(Libsnap7_PROCESS_INCLUDES Libsnap7_INCLUDE_DIR)
#set(Libsnap7_PROCESS_LIBS Libsnap7_LIBRARY)

CMakeLists.txt:

cmake_minimum_required(VERSION 2.8.3)
project(agv_snap7_driver)

set(CMAKE_VERBOSE_MAKEFILE ON)

## Compile as C++11,supported in ROS Kinetic and newer
add_compile_options(-std=c++11)

##########################################################################################

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
MESSAGE( STATUS "CMAKE_MODULE_PATH: " ${CMAKE_MODULE_PATH} )

find_package(Libsnap7 required)
include_directories(${Libsnap7_INCLUDE_Dirs})

message("Libsnap7_LIBRARIES ${Libsnap7_LIBRARIES}")
message("Libsnap7_INCLUDE_Dirs ${Libsnap7_INCLUDE_Dirs}")

##########################################################################################

## Find catkin macros and libraries
## if COMPONENTS list like find_package(catkin required COMPONENTS xyz)
## is used,also find other catkin packages
find_package(catkin required COMPONENTS
  roscpp
  nodelet
  agv_utils
  agv_msgs
)

###################################
## catkin specific configuration ##
###################################
## The catkin_package macro generates cmake config files for your package
## Declare things to be passed to dependent projects
## INCLUDE_Dirs: uncomment this if your package contains header files
## LIBRARIES: libraries you create in this project that dependent projects also need
## CATKIN_DEPENDS: catkin_packages dependent projects also need
## DEPENDS: system dependencies of this project that dependent projects also need
catkin_package(
  INCLUDE_Dirs include
  LIBRARIES ${PROJECT_NAME}
  CATKIN_DEPENDS ${THIS_PACKAGE_ROS_DEPS}
  DEPENDS Libsnap7
  )

###########
## Build ##
###########

## Specify additional locations of header files
## Your package locations should be listed before other locations
include_directories(
  include
  ${catkin_INCLUDE_Dirs}
  ${Libsnap7_INCLUDE_Dirs}
  )

## Declare a C++ library
add_library(${PROJECT_NAME}
  src/agv_snap7_driver_config.cpp
  src/agv_snap7_driver.cpp
  )

## Add cmake target dependencies of the executable
add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})

## Specify libraries to link a library or executable target against
target_link_libraries( ${PROJECT_NAME} ${catkin_LIBRARIES} ${Libsnap7_LIBRARIES})

#############
## Install ##
#############

## Mark libraries for installation
 install(TARGETS ${PROJECT_NAME}
   ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
   LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
   RUNTIME DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION}
 )

## Mark cpp header files for installation
 install(DIRECTORY include/${PROJECT_NAME}/
   DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}
   FILES_MATCHING PATTERN "*.h"
   PATTERN ".svn" EXCLUDE
 )

install(FILES nodelet.xml
    DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
  )

install(DIRECTORY launch/
  DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}/launch
  FILES_MATCHING PATTERN "*.launch"
  PATTERN ".svn" EXCLUDE
  )

install(DIRECTORY config/
  DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}/config
  FILES_MATCHING PATTERN "*.yaml"
  PATTERN ".svn" EXCLUDE
  )

catkin_make 输出

-- +++ processing catkin package: 'agv_snap7_driver'
-- ==> add_subdirectory(agv_base_hardware/agv_snap7_driver)
-- CMAKE_MODULE_PATH: /home/twobit/workspaces/bestvc_ws/branches/Gestamp_Amorebieta_01/base/src/agv_base_hardware/agv_snap7_driver/cmake
Libsnap7_INCLUDE_DIR /usr/include
Libsnap7_LIBRARY /usr/lib/libsnap7.so
Libsnap7_LIBRARIES /usr/lib/libsnap7.so
Libsnap7_INCLUDE_Dirs /usr/include

lld 输出

$ ldd libagv_snap7_driver.so | grep snap
  libsnappy.so.1 => /usr/lib/x86_64-linux-gnu/libsnappy.so.1 (0x00007fe89c01e000)

如您所见,找到了包含以及库。向 ${Libsnap7_LIBRARIES} 提供 target_link_libraries 不是重新链接 libsnap7.so

从源代码安装 snap7 后,我发现示例 cpp 链接正确。

如果有人知道为什么会出现此错误链接,我很乐意提供帮助。

先谢谢你!

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

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?