Search code examples
c++linkercmakerestbed

Linker error using restbed


so, i'm trying to compile my program which has restbed as dependency. I already compiled restbed with the following command:

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

Compiling restbed does not result in any errors.

Now the Problem:

I'm using the example source code from here: https://github.com/Corvusoft/restbed

This is my 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})

When i try to compile my project i get the following linker errors:

http://pastebin.com/hXPmAV2W (too much text for StackOverflow...)

My guess is that the OpenSSL library is not linked into the static .a file of restbed, but i put -DBUILD_SSL in the build command.

I hope anyone of you can help me with this problem. It's driving me crazy.

If you need more information, just tell me and i'll edit this post.


Solution

  • We use the following cmake modules to locate the necessary dependencies for projects reliant on 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 ( )
    

    You can see an example of this in action at the RestQ GIT repository.