2016-02-04 3 views
1

, поэтому я пытаюсь скомпилировать мою программу, которая покоится как зависимость. я уже скомпилированные restbed с помощью следующей команды:Ошибка компоновщика с помощью обложки

cmake -DBUILD_TESTS=NO -DBUILD_SSL=YES -DBUILD_SHARED=NO 
make -j4 install 

Компиляция restbed не приводит каких-либо ошибок.

Теперь проблема:

Я использую исходный код примера здесь: https://github.com/Corvusoft/restbed

Это мой CMakeLists:

cmake_minimum_required (VERSION 2.6) 
project(FDRService CXX) 

# Setup 
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") 

set(CMAKE_BINARY_DIR "./build") 
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}) 
set(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR}) 

# FD Variables 
set(FDRService_VERSION_MAJOR 1) 
set(FDRService_VERSION_MINOR 0) 

set(FDRService_INCLUDE_DIR "./include") 
set(FDRService_SOURCE_DIR "./src") 

# RestBED 
set(RESTBED_ROOT "dependency/restbed/distribution") 
set(RESTBED_INCLUDE_DIR "${RESTBED_ROOT}/include") 
set(RESTBED_LIBRARY_DIR "${RESTBED_ROOT}/library") 

# find all libraries 
file(GLOB_RECURSE RESTBED_LIBRARY_FILES 
    "${RESTBED_LIBRARY_DIR}/*.a" 
) 

include_directories(${RESTBED_INCLUDE_DIR}) 

# find project source files 
file(GLOB_RECURSE FDRService_FILES 
    "${FDRService_INCLUDE_DIR}/*.h" 
    "${FDRService_INCLUDE_DIR}/*.hpp" 
    "${FDRService_SOURCE_DIR}/*.c" 
    "${FDRService_SOURCE_DIR}/*.cpp" 
) 

add_executable(FDRService ${FDRService_FILES}) 
target_link_libraries(FDRService ${RESTBED_LIBRARY_FILES}) 

Когда я пытаюсь скомпилировать мой проект я получаю следующие ошибки компоновщика:

http://pastebin.com/hXPmAV2W (слишком много текста для StackOverflow ...)

Мое предположение заключается в том, что библиотека OpenSSL не связана с статическим файлом .a, но я поместил -DBUILD_SSL в команду сборки.

Я надеюсь, что кто-то из вас может помочь мне с этой проблемой. Это сводит меня с ума.

Если вам нужна дополнительная информация, просто скажите мне, и я отредактирую эту запись.

+0

«Мое предположение». Это похоже на 100% уверенную ставку. Вы уверены, что знаете, что делает '-DBUILD_SSL'? –

+2

Линкер не находит эти символы, потому что библиотеки, в которых они проживают, не были указаны ему. При быстром просмотре ошибок, похоже, вам нужно передать '-lpthread -lcrypto -lssl' в компоновщик (конечно, 3 библиотеки должны находиться в' LD_LIBRARY_PATH'). Не уверен, как перевести это в синтаксисе _cmake_. – CristiFati

+0

Ну, я не думал добавлять лишние библиотеки, глупый ... Спасибо. он работает сейчас – Hibbel

ответ

2

Мы используем следующие модули cmake для определения необходимых зависимостей для проектов, зависящих от Restbed.

Findrestbed.cmake

find_path(restbed_SOURCE CMakeLists.txt HINTS "${CMAKE_SOURCE_DIR}/dependency/restbed") 

if (restbed_SOURCE) 
    set(restbed_FOUND TRUE) 
    set(restbed_BUILD "${CMAKE_CURRENT_BINARY_DIR}/restbed_build") 
    set(restbed_DISTRIBUTION "${CMAKE_CURRENT_BINARY_DIR}/distribution") 

    include(ExternalProject) 
    ExternalProject_Add(restbed SOURCE_DIR ${restbed_SOURCE} 
         PREFIX restbed_build 
         INSTALL_DIR ${restbed_DISTRIBUTION} 
         CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${restbed_DISTRIBUTION} -DBUILD_SSL=${BUILD_SSL} -DBUILD_SHARED=NO) 

    set(restbed_INCLUDE "${restbed_DISTRIBUTION}/include") 
    set(restbed_LIBRARY "${restbed_DISTRIBUTION}/library/${CMAKE_STATIC_LIBRARY_PREFIX}restbed${CMAKE_STATIC_LIBRARY_SUFFIX}") 

    message(STATUS "${Green}Found Restbed include at: ${restbed_SOURCE}${Reset}") 
else () 
    message(FATAL_ERROR "${Red}Failed to locate Restbed dependency.${Reset}") 
endif () 

Findopenssl.cmake

find_library(ssl_LIBRARY ssl ssleay32 HINTS "${CMAKE_SOURCE_DIR}/dependency/restbed/dependency/openssl/out32dll" "${CMAKE_SOURCE_DIR}/dependency/restbed/dependency/openssl" "/usr/lib" "/usr/local/lib" "/opt/local/lib") 
find_library(crypto_LIBRARY crypto libeay32 HINTS "${CMAKE_SOURCE_DIR}/dependency/restbed/dependency/openssl/out32dll" "${CMAKE_SOURCE_DIR}/dependency/restbed/dependency/openssl" "/usr/lib" "/usr/local/lib" "/opt/local/lib") 
find_path(ssl_INCLUDE openssl/ssl.h HINTS "${CMAKE_SOURCE_DIR}/dependency/restbed/dependency/openssl/inc32" "${CMAKE_SOURCE_DIR}/dependency/restbed/dependency/openssl/include" "/usr/include" "/usr/local/include" "/opt/local/include") 

if (ssl_INCLUDE AND ssl_LIBRARY AND crypto_LIBRARY) 
    set(OPENSSL_FOUND TRUE) 
    add_definitions(-DBUILD_SSL=TRUE) 

    if (APPLE AND BUILD_SSL) 
     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations") 
    endif() 

    message(STATUS "${Green}Found OpenSSL library at: ${ssl_LIBRARY}${Reset}") 
    message(STATUS "${Green}Found OpenSSL include at: ${ssl_INCLUDE}${Reset}") 
    message(STATUS "${Green}Found Crypto library at: ${crypto_LIBRARY}${Reset}") 
else () 
    message(FATAL_ERROR "${Red}Failed to locate OpenSSL dependency. see dependency/restbed/dependency/openssl; ./config shared; make all${Reset}") 
endif () 

Вы можете увидеть пример этого в действии на RestQ GIT repository.

Смежные вопросы