Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何修复架构x86_64的未定义符号,Boost Asio 1.58_C++_Ssl_Boost_Https_Boost Asio - Fatal编程技术网

C++ 如何修复架构x86_64的未定义符号,Boost Asio 1.58

C++ 如何修复架构x86_64的未定义符号,Boost Asio 1.58,c++,ssl,boost,https,boost-asio,C++,Ssl,Boost,Https,Boost Asio,我正在开发一个小软件,它需要一个监听http请求的小型服务器。不幸的是,生产服务器仅使用https,因此请求失败。我在网上搜索并找到了以下示例: 我尽了最大努力应用所需的更改。但我不能编译它。我在MacOS机器上,但服务器是Ubuntu服务器。我通过brew安装了OpenSSL 在链接过程中编译失败: [ 98%] Linking CXX executable GpdServer Undefined symbols for architecture x86_64: "_ERR_remove_

我正在开发一个小软件,它需要一个监听http请求的小型服务器。不幸的是,生产服务器仅使用https,因此请求失败。我在网上搜索并找到了以下示例:

我尽了最大努力应用所需的更改。但我不能编译它。我在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文件如下:

我的构建系统是CMake。包括它工作得很好


我做错了什么?我该如何解决这个问题?

事实证明,macOS才是问题所在。我通过brew安装了OpenSSL。首先,我的CLion/CMake没有找到它,所以我添加了一个if来检查它是否是Apple PC。在这种情况下,我手动将路径设置为brew给我的路径。现在,由于某种原因,链接不起作用


在使用libssl-dev的Linux上没有任何问题。

Boost ASIO不是一个只包含头的库,特别是在使用SSL组件时。你需要链接到一个库才能让它工作。我想我是这样做的,请看第36行你链接到的那一行是OpenSSL库,我说的是一个Boost库。将
asio
添加到
find_-package(Boost)
命令中,该命令将把Boost-asio库添加到
Boost_库
。抱歉,似乎我错了。Boost ASIO本身是一个只包含标题的库,因此您不应该在
find\u package
命令中使用它。我本人从未使用过ASIO(Boost或standalone)的SSL功能,因此我恐怕无法进一步帮助您。好的,谢谢您。这似乎是mac的一个问题。在Linux上它可以工作。我将在一分钟内回答这个问题,以便详细说明。该死的mac..你曾经在mac上解决过这个问题吗?我实际上是通过在CMakeLists.txt上链接来解决的,比如:target_link_库(可执行文件名称pthread ssl crypto boost_system)。。。除了指定包含和链接目录之外。