简体   繁体   English

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

[英]undefined reference to symbol 'sem_close@@GLIBC_2.2.5'

I'm trying to compile a project that has ActiveMQ functions used (hence the library), however I get the following error: 我正在尝试编译一个使用了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

I must say that code-wise I do not have a doubt, it just works fine. 我必须说,就代码方面而言,我毫不怀疑,它工作正常。 This error I started to get after I formatted my computer, in which one of a few libraries required for ActiveMQ may have gone. 格式化计算机后,我开始出现此错误,其中ActiveMQ所需的一些库之一可能已消失。 libapr is one of them, for sure. libapr是其中之一。

However, I do have this library installed on my computer. 但是,我确实在计算机上安装了该库。 When I locate it, I can see it as w: 找到它后,我可以看到它为w:

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

So it is there. 在那里。 And Also in my CMakeLists.txt file I refer it as : 而且在我的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")

So I do not know what causes the error. 所以我不知道是什么原因导致了错误。 I looked at everywhere possible and still have no answer. 我看着所有可能的地方,但仍然没有答案。

Any thoughts? 有什么想法吗?

PS: My complete CMakeLists.txt : cmake_minimum_required(VERSION 2.8.3) project(some_project include(FindProtobuf) PS:我完整的CMakeLists.txt :cmake_minimum_required(VERSION 2.8.3)project(some_project include(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}
 )

Okay, thanks to @Tsyvarev , found the problem. 好的,感谢@Tsyvarev,找到了问题。

It lies within the linking order which is specified in CMakeLists.txt file. 它位于CMakeLists.txt文件中指定的链接顺序之内。 It should have the following order, in which -lpthread comes before libapr-1.a 它应该具有以下顺序,其中-lpthreadlibapr-1.a之前

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

 )

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM