【发布时间】:2017-08-25 09:32:39
【问题描述】:
我正在开发一个小软件,它需要一个小型服务器来监听 http 请求。不幸的是,生产服务器仅使用 https,因此请求失败。我在网上搜索并找到了这个例子:http://www.boost.org/doc/libs/1_65_0/doc/html/boost_asio/example/cpp03/ssl/server.cpp
我已尽力应用所需的更改。但我无法编译它。我在 MacOS 机器上,但服务器是 Ubuntu 服务器。我通过 brew 安装了 OpenSSL。
链接过程中编译失败:
[ 98%] Linking CXX executable GpdServer
Undefined symbols for architecture x86_64:
"_ERR_remove_thread_state", referenced from:
boost::asio::ssl::detail::openssl_init_base::do_init::~do_init() in main.cpp.o
boost::asio::ssl::detail::openssl_init_base::do_init::~do_init() in TcpServer.cpp.o
boost::asio::ssl::detail::openssl_init_base::do_init::~do_init() in TcpConnection.cpp.o
"_TLSv1_1_client_method", referenced from:
boost::asio::ssl::context::context(boost::asio::ssl::context_base::method) in TcpServer.cpp.o
"_TLSv1_1_method", referenced from:
boost::asio::ssl::context::context(boost::asio::ssl::context_base::method) in TcpServer.cpp.o
"_TLSv1_1_server_method", referenced from:
boost::asio::ssl::context::context(boost::asio::ssl::context_base::method) in TcpServer.cpp.o
"_TLSv1_2_client_method", referenced from:
boost::asio::ssl::context::context(boost::asio::ssl::context_base::method) in TcpServer.cpp.o
"_TLSv1_2_method", referenced from:
boost::asio::ssl::context::context(boost::asio::ssl::context_base::method) in TcpServer.cpp.o
"_TLSv1_2_server_method", referenced from:
boost::asio::ssl::context::context(boost::asio::ssl::context_base::method) in TcpServer.cpp.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [GpdServer] Error 1
make[1]: *** [CMakeFiles/GpdServer.dir/all] Error 2
make: *** [all] Error 2
导致此问题的 TcpConnection 文件位于: https://github.com/cwansart/gpd/blob/master/src/TcpServer.h https://github.com/cwansart/gpd/blob/master/src/TcpServer.cpp
我的构建系统是 CMake。包括它工作正常。
我做错了什么?我该如何解决这个问题?
【问题讨论】:
-
Boost ASIO 不是一个只有头文件的库,尤其是 SSL 组件。您实际上需要link 与一个库才能工作。
-
我以为我做到了,见第 36 行 github.com/cwansart/gpd/blob/master/CMakeLists.txt#L36
-
您链接到的行是 OpenSSL 库,我说的是 Boost 库之一。将
asio添加到find_package(Boost)命令,这会将Boost ASIO 库添加到Boost_LIBRARIES。 -
对不起,看来我错了。 Boost ASIO itself 是一个只有头文件的库,所以你不应该在
find_package命令中使用它。我自己从未使用过 ASIO(Boost 或独立)的 SSL 功能,所以恐怕无法进一步帮助您。 -
好的,谢谢。好像是mac的问题。在 Linux 上它可以工作。我会在一分钟内回答这个问题来详细说明它。该死的麦克..
标签: c++ ssl boost https boost-asio