我正在運行OSX Yosemite 10.10.5和clang-700.0.72以及brew裝機提升1.56。boost :: asio :: ssl :: context :: context(boost :: asio :: ssl :: context_base :: method)undefined符號
我使用boost :: asio for non-ssl和tls套接字。 在我的項目中,違規行是而不是,但似乎起源於boost 1.56本身。
我用cmake,而且我用openssl連接,使用find_package(OpenSSL REQUIRED)
,我確實有openssl 1.0.2g
。
該項目採用C++ 11,和有問題的線條似乎是:
Undefined symbols for architecture x86_64: "_SSLv2_client_method", referenced from: boost::asio::ssl::context::context(boost::asio::ssl::context_base::method) in asio_tls.cpp.o "_SSLv2_method", referenced from: boost::asio::ssl::context::context(boost::asio::ssl::context_base::method) in asio_tls.cpp.o "_SSLv2_server_method", referenced from: boost::asio::ssl::context::context(boost::asio::ssl::context_base::method) in asio_tls.cpp.o ld: symbol(s) not found for architecture x86_64
我不使用的SSLv2可言,其實代碼專注於只使用TLS V2:
class asio_socket_https
{
public:
asio_socket_https(const std::string token)
: ctx_(boost::asio::ssl::context::tlsv12_client), token_(token)
{}
後來,intialising插座和上下文的時候,我做的:
ctx_.set_options(boost::asio::ssl::context::default_workarounds
|boost::asio::ssl::context::no_sslv2
|boost::asio::ssl::context::no_sslv3
|boost::asio::ssl::context::no_tlsv1
|boost::asio::ssl::context::single_dh_use);
我沒有編譯錯誤,應用程序鏈接到libssl/libcrypto,並且我沒有在Linux(僅限OSX)下測試它。
我看過同一個主題的SO問題,但沒有回答here。
實際鏈接標誌:
/usr/bin/g++ -std=c++11 -Wall -g -Wl,-search_paths_first -Wl,-headerpad_max_install_names CMakeFiles/asio_tls.dir/examples/asio_tls.cpp.o -o asio_tls librapp.0.2.dylib /usr/local/lib/libboost_system-mt.dylib /usr/local/lib/libboost_thread-mt.dylib /usr/local/lib/libboost_random-mt.dylib /usr/local/lib/libboost_unit_test_framework-mt.dylib /usr/local/lib/libboost_program_options-mt.dylib /usr/local/Cellar/openssl/1.0.2g/lib/libssl.dylib /usr/local/Cellar/openssl/1.0.2g/lib/libcrypto.dylib
編輯
我今天測試相同的代碼的Ubuntu 14.04之下,檢測的OpenSSL 1.0.1f當它建立了良好的(與完全沒有問題)。 這開始看起來像一個OSX特定的問題。
@rhashimoto看起來是正確的,而鏈接器正在使用/usr/local/Cellar/openssl/
中的openssl的Cellar版本,所使用的頭文件在/usr/local/openssl
之下,我不認爲它是由brew管理的。
SOLUTION
的問題是在我的CMakeLists.txt
我曾以爲,find_package(OpenSSL REQUIRED)
就足夠了,可惜的是這是什麼做的是打破庫的進口庫頭連接的版本。
默認庫是OSX的openssl,而我明確鏈接到${OPENSSL_LIBRARIES}
。
只需添加以下固定的問題(現在它使用從沖泡安裝了OpenSSL):
find_package(OpenSSL REQUIRED)
if (OPENSSL_FOUND)
include_directories(${OPENSSL_INCLUDE_DIR})
endif()
然後做一個target_link_libraries(... ${OPENSSL_LIBRARIES})
檢查鏈接參數的順序(庫去_after_自己的對象) – sehe
@sehe謝謝,順序是正確的,我已經添加了鏈接標誌(cmake詳細)的編輯。看來我錯過了特定的openssl函數 - 因爲openssl的其餘部分鏈接正確。我認爲這是本地化的OSX,但我沒有訪問Linux的ATM。 –
我將驗證您正在編譯的OpenSSL頭文件是否與您要鏈接的OpenSSL庫文件頭文件相對應。你可以嘗試在你的編譯器選項中注入一個'-H'標誌來查找。 – rhashimoto