【问题标题】:How to fix Undefined symbols for architecture x86_64, Boost Asio 1.58如何修复架构 x86_64、Boost Asio 1.58 的未定义符号
【发布时间】: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


【解决方案1】:

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

在带有 libssl-dev 的 Linux 上没有问题。

【讨论】:

  • 你在 mac 上解决过这个问题吗?
  • 我实际上是通过像这样链接 CMakeLists.txt 来修复它: target_link_libraries(executable_name pthread ssl crypto boost_system)... 除了指定包含和链接目录。
猜你喜欢
  • 2015-06-15
  • 1970-01-01
  • 1970-01-01
  • 2014-06-23
  • 1970-01-01
  • 2020-12-10
  • 1970-01-01
  • 2015-06-03
  • 1970-01-01
相关资源
最近更新 更多