2017-12-12 21 views
0

내 mac에서 openssl을 찾으려면 cmake에게 문제가 있습니다. 말하자면, 저는 CMake를 사용하는 아마추어인데, 저는 그것과의 친분이 매우 최근이고 가끔씩 있습니다. 즉, 저는 작은 프로젝트를 만들어서 빌드하고 실행하는 것과 같은 간단한 작업을 cmake에서 할 수 있습니다. 일부 명령 (find_library, find_package, ...)은 항상 저를 곤혹스럽게 만듭니다. cmake는 비표준 경로에서 openssl 라이브러리를 찾습니다.

나는 다운로드 및 설치하려면 openssl은 (./configure를, 확인하고 설치하게) 그리고 내가 내 프로그램에서 간단한 포함하려면 openssl에 대한 도움말을 볼 주위에 인터넷 검색을했다/옵션/OpenSSL을

에 파일을 넣어했다.

하나의 검색 결과가 FindOpenSSL here (https://cmake.org/cmake/help/v3.6/module/FindOpenSSL.html) 명령을 가리 킵니다. FindOpenSSL을 사용할 때 cmake는 FindOpenSSL이 명령이 아니라고 오류를 보냈습니다.

또한 find_library 및 find_package 명령을 시도했습니다. 그러나 변수 OPENSSL_FOUND를 검사하면 여전히 정의되지 않습니다.

openssl에 대한 변수를 하드 코딩해야합니다 (또는 cmake에 -D 옵션을 전달해야합니다). 가장 좋은 방법은 무엇입니까? cmake의 참조 매뉴얼은 find_library와 find_package 사이의 진정한 차이점을 이해하지 못하거나, 다른 find_library와 find_package 사이의 차이점을 이해하지 못하기 때문에 퍼즐 조각처럼 보입니다.

내가 여기있는 유일한 사람입니까, 아니면 혼란스럽고 어려움을 겪고있는 더 많은 영혼입니까?

나에게 올바른 방향을 알려주고이 혼란에서 나를 도우려는 사람 덕분입니다. (...) 난 그냥 find_libraries 대신, find_package (OpenSSL을)를 사용, 지금

ravindranaths-MacBook-Pro:crypt_handlers ravindranath$ cat CMakeLists.txt 
cmake_minimum_required (VERSION 3.5.1) 

# search for CPP_HOME. If found use this as the install_root dir. 
# else, use /usr/local 
message (STATUS "Searching for environment var CPP_HOME ...") 
if (DEFINED ENV{CPP_HOME}) 
message (STATUS "Found CPP_HOME: " $ENV{CPP_HOME}) 
set (CPP_HOME $ENV{CPP_HOME}) 
else() 
message (STATUS "Could not find. Treating /usr/local as CPP_HOME...") 
set (CPP_HOME /usr/local) 
endif() 
set(Boost_USE_STATIC_LIBS ON) 
########################################################### 
set(CMAKE_INCLUDE_PATH /usr/local/ssl/include/openssl) 

set(OPENSSL_USE_STATIC_LIBS ON) 
############################################################ 
find_package(Boost 1.45.0 COMPONENTS system) 
find_package (Threads) 

set (CMAKE_CXX_STANDARD 11) 
include_directories(../../include) 
include_directories(../../include/ext) 
include_directories(../../include/ext/spdlog) 
include_directories(${CPP_HOME}/externals/plog/include) 

add_executable(crypt app.cpp) 

link_directories(../../build/src) 
target_link_libraries (crypt ${CMAKE_THREAD_LIBS_INIT}) 

find_library(OpenSSL_LIB libcrypto.a libssl.a) 
#find_package(OpenSSL) 

if (OPENSSL_FOUND) 
message (STATUS "OPENSSL found") 
message (STATUS "OpenSSL INclude directories:" OPENSSL_INCLUDE_DIR) 
else() 
message (FATAL_ERROR "OpenSSL Not found.") 
endif() 

include_directories(${OPENSSL_INCLUDE_DIR}) 
target_link_libraries(crypt ${CMAKE_DL_LIBS}) 
TARGET_LINK_LIBRARIES(crypt ${OPENSSL_LIBRARIES} ${LIBYAML_LIBRARIES} pthread -ldl) 
#target_link_libraries(crypt /usr/local/ssl/lib/libcrypto.a /usr/local/lib/libssl.a) 
target_link_libraries(crypt /usr/local/lib/libcrypto.a /usr/local/lib/libssl.a) 

if(Boost_FOUND) 
include_directories(${include_directories} ${Boost_INCLUDE_DIRS}) 
target_link_libraries(crypt nettu ${Boost_LIBRARIES}) 
endif() 

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/dist/bin) 

UPDATE :

나의 현재 CMakeLists.txt은 다음과 같습니다. 그리고, 나는 다음과 같이 cmake를 실행하고 있습니다 :

cmake -DCMAKE_BUILD_TYPE=Debug -DOPENSSL_ROOT_DIR=/opt/openssl/ -DOPENSSL_LIBRARIES=/opt/openssl/lib/ .. 

cmake는 메이크를 작성하여 성공합니다. 그러나 make를 실행할 때 링커 오류가 발생합니다. 다음과 같은 실종 libssl.a에 오류 포인트 :

make[2]: *** No rule to make target `/usr/local/lib/libssl.a', needed by `examples/crypt_handlers/crypt'. Stop. 

내가 이해하지 못하는 것은 make가 여전히/대신 "/ .../usr/지방/lib 디렉토리"에 libssl.a을 찾고 있다는 것입니다 opt/openssl/lib.

해결 방법?

답변

0

#find_library(OpenSSL_LIB libcrypto.a libssl.a) 
find_package(OpenSSL) 

하고 실행을 다음과 같이 변경할 수 있습니다

cmake -DOPENSSL_ROOT_DIR =/옵션/OpenSSL을

OPENSSL_ROOT_DIR 힌트는 어디 FindOpenSSL.cmake 표준 모듈 인 경우 OpenSSL 설치를위한 루트를 찾으십시오.

+0

Thx. 나는 지금 심부름을 할 수있다. 하지만 make를 실행할 때, libssl.a의 링커 오류로 인해 실패한다는 것을 알았습니다. 변수 $ {OPENSSL_LIBRARIES}을 출력하면 librypto.a 만 인쇄되므로 libssl.a가 설정되지 않습니다. 내가 여기서 뭔가를 놓치고 있니? –

+0

문제가 해결되었습니다. CMakeLists.txt는 link_libraries에 대해/usr/local/...에 대한 하드 코드 된 경로가있는 바닥에 어딘가에 여분의 줄이있었습니다. –