2016-11-29 9 views
0

Я пытаюсь скомпилировать проект, который имеет функции ActiveMQ используемые (следовательно, библиотека), однако я получаю следующее сообщение об ошибке:неопределенная ссылка на символ «sem_close @@ GLIBC_2.2.5»

/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 '[email protected]@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 - один из них, конечно.

Однако у меня эта библиотека установлена ​​на моем компьютере. Когда я его обнаружу, я вижу это как:

/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") 

Так что я не знаю, что вызывает ошибку. Я смотрел повсюду, и у меня нет ответа.

Любые мысли?

PS: Мой полный CMakeLists.txt: cmake_minimum_required (версия 2.8.3) проект (some_project включают (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} 
) 
+0

'DSO, отсутствующий в командной строке', легко переводится в googled и означает, что порядок связывания библиотек * неверен *. Ваша библиотека 'libapr-1.a' должна появиться ** перед **' -lpthread' в списке ссылок. – Tsyvarev

+0

У меня нет '-lpthread' в моем' CMakeLists.txt', я не знаю, в каком порядке. Возможно, я могу добавить свой полный «CMakeLists.txt». –

ответ

0

Хорошо, благодаря @Tsyvarev, нашел проблему

.

Он находится в порядке ссылки, указанном в файле CMakeLists.txt. Он должен иметь следующий порядок, в котором -lpthread подходит к libapr-1.a

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

)