对符号“sem_close@@GLIBC_2.2.5”的未定义引用

Posted

技术标签:

【中文标题】对符号“sem_close@@GLIBC_2.2.5”的未定义引用【英文标题】:undefined reference to symbol 'sem_close@@GLIBC_2.2.5' 【发布时间】:2016-11-29 13:53:32 【问题描述】:

我正在尝试编译一个使用 ActiveMQ 函数的项目(因此是库),但是我收到以下错误:

/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/libapr-1.a(proc_mutex.o): undefined reference to symbol 'sem_close@@GLIBC_2.2.5'

/lib/x86_64-linux-gnu/libpthread.so.0: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status

我必须说,就代码而言,我毫无疑问,它工作得很好。我在格式化计算机后开始出现此错误,其中 ActiveMQ 所需的几个库之一可能已经消失。 libapr 肯定是其中之一。

但是,我确实在我的计算机上安装了这个库。当我找到它时,我可以看到它是 w:

/usr/lib/libapr-1.a
/usr/lib/x86_64-linux-gnu/libapr-1.a
/usr/local/apr/lib/libapr-1.a

所以它就在那里。此外,在我的 CMakeLists.txt 文件中,我将其称为:

set(ACTIVEMQ_CPP "/usr/local/lib/libactivemq-cpp.so")
set(ACTIVEMQ_INCLUDE_DIR "/usr/local/include/activemq-cpp-3.8.4/")

set(LIBAPR_LIB "/usr/lib/libapr-1.a")
set(LIBAPR_INCLUDE_DIR "/usr/include/apr-1")

所以我不知道是什么导致了错误。我到处寻找,仍然没有答案。

有什么想法吗?

P.S: 我的完整 CMakeLists.txt : cmake_minimum_required(版本 2.8.3) 项目(一些项目 包括(FindProtobuf)

set(EXECUTABLE_OUTPUT_PATH $PROJECT_SOURCE_DIR/bin)
set(LIBRARY_OUTPUT_PATH $PROJECT_SOURCE_DIR/lib)
set_source_files_properties($PROTO_SRC $PROTO_HEADER PROPERTIES GENERATED TRUE)

# check c++11 / c++0x
include(CheckCXXCompilerFlag)
CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)
CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X)
if(COMPILER_SUPPORTS_CXX11)
    set(CMAKE_CXX_FLAGS "-std=c++11")
elseif(COMPILER_SUPPORTS_CXX0X)
    set(CMAKE_CXX_FLAGS "-std=c++0x")
else()
    message(FATAL_ERROR "The compiler $CMAKE_CXX_COMPILER has no C++11 support. Please use a different C++ compiler.")
endif()

set(PROTO_SRC $PROJECT_SOURCE_DIR/src-gen)
set(PROTO_HEADER  $PROJECT_SOURCE_DIR/src-gen)

find_package(catkin REQUIRED COMPONENTS
  cv_bridge
  roscpp
  sensor_msgs
  std_msgs
  image_transport
)

find_package(OpenCV REQUIRED)
find_package(Protobuf REQUIRED)

catkin_package(
INCLUDE_DIRS include
LIBRARIES uwsim_imgproc filters
CATKIN_DEPENDS cv_bridge roscpp sensor_msgs std_msgs
#  DEPENDS system_lib
)

set(ACTIVEMQ_CPP "/usr/local/lib/libactivemq-cpp.so")
set(ACTIVEMQ_INCLUDE_DIR "/usr/local/include/activemq-cpp-3.8.4/")

set(LIBAPR_LIB "/usr/lib/libapr-1.a")
set(LIBAPR_INCLUDE_DIR "/usr/include/apr-1")


PROTOBUF_GENERATE_CPP(PROTO_SRCS PROTO_HDRS proto/VisionData.proto)

include_directories(
  $catkin_INCLUDE_DIRS
  $OpenCV_INCLUDE_DIRS 
  $PROTOBUF_INCLUDE_DIRS
  $CMAKE_CURRENT_BINARY_DIR
  include
  $ACTIVEMQ_INCLUDE_DIR
  $LIBAPR_INCLUDE_DIR
)

link_directories( 
  $OpenCV_LINK_DIRS
)

add_library(filters
      src/HorizonDetector.cpp
        src/ActivemqSender.cpp
)

add_executable(cameraSubscriber src/main.cpp $PROTO_SRCS $PROTO_HDRS)

add_dependencies(cameraSubscriber $$PROJECT_NAME_EXPORTED_TARGETS $catkin_EXPORTED_TARGETS)

target_link_libraries(filters
   $OpenCV_LIBRARIES
)

target_link_libraries(cameraSubscriber
   $catkin_LIBRARIES
   $OpenCV_LIBRARIES
   $PROTOBUF_LIBRARIES
   $ACTIVEMQCPP_LIBRARIES
   filters
   $ACTIVEMQ_CPP
   $LIBAPR_LIB
 )

【问题讨论】:

DSO missing from command line 很容易被谷歌搜索到,这意味着链接库的顺序是不正确的。你的libapr-1.a 库应该在链接列表中之前 -lpthread 我的CMakeLists.txt 中没有-lpthread,因此我不知道是什么顺序。也许我可以添加完整的CMakeLists.txt 【参考方案1】:

好的,感谢@Tsyvarev ,找到了问题。

它位于CMakeLists.txt 文件中指定的链接顺序内。它应该具有以下顺序,其中-lpthreadlibapr-1.a 之前

target_link_libraries(cameraSubscriber
   $catkin_LIBRARIES
   $OpenCV_LIBRARIES
   $LIBAPR_LIB
   $PROTOBUF_LIBRARIES
   $ACTIVEMQCPP_LIBRARIES
   filters
   $ACTIVEMQ_CPP

 )

【讨论】:

以上是关于对符号“sem_close@@GLIBC_2.2.5”的未定义引用的主要内容,如果未能解决你的问题,请参考以下文章

对符号/图像进行分类的建议

CSS 对手机表情符号字体的引用?

为啥要使用字符串键对符号进行哈希处理

MXNet 符号编程

为啥对共享库本身中定义的符号使用全局偏移表?

在 Xcode 中对子类使用符号断点?