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.
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.