链接到 MacOS 上预编译的 QuantLib 二进制文件时未定义的 Boost 符号

Posted

技术标签:

【中文标题】链接到 MacOS 上预编译的 QuantLib 二进制文件时未定义的 Boost 符号【英文标题】:Undefined Boost symbol when linking to pre-compiled QuantLib binaries on MacOS 【发布时间】:2021-10-13 01:59:00 【问题描述】:

我正在尝试编译一些依赖于 QuantLib 的 C++,而后者又依赖于 Boost。我正在开发 MacBook Pro M1(ARM 架构)。我使用此页面上的说明安装了 Boost 和 QuantLib:https://www.quantlib.org/install/macosx.shtml。然后我尝试编译以下源代码:

#include <iostream>
#include <ql/quantlib.hpp>
 
int main(int, char*[])

    QuantLib::Option::Type OptionType(QuantLib::Option::Call);
    std::cout << "Option Type = " << OptionType << std::endl;
    
    return 0;

使用以下命令:

clang++ -std=c++11 ql_ex1.cpp -o build/ql_ex1 $(INC) $(LIB) \
    -I/opt/homebrew/Cellar/quantlib/1.23/include -I/opt/homebrew/Cellar/boost/1.76.0/include \
    -L/opt/homebrew/Cellar/boost/1.76.0/lib -L/opt/homebrew/Cellar/quantlib/1.23/lib

这给了我以下错误消息:

Undefined symbols for architecture arm64:
  "boost::assertion_failed(char const*, char const*, char const*, long)", referenced from:
      long double boost::math::detail::sinpx<long double>(long double) in ql_ex1-044d3e.o
  "boost::assertion_failed_msg(char const*, char const*, char const*, char const*, long)", referenced from:
      boost::array<long double, 171ul>::operator[](unsigned long) const in ql_ex1-044d3e.o
...
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1

到目前为止,我已经尝试了以下方法,

安装 x86 二进制文件并在仿真中运行 clang++。我看到同样的未定义符号错误。 尝试识别我需要链接到的 Boost 共享库文件。我找不到任何包含 assertion_failed 符号的内容。

有人能指出这个符号的定义位置(如果有的话)吗?如果我只是缺少正确的编译器选项,或者是否有更基本的问题需要解决,这将很有用。

【问题讨论】:

【参考方案1】:

我认为您在命令行中缺少-lQuantLib?您是在告诉编译器在哪里查找库(-L 开关),而不是要链接哪些库。

另外,请检查 homebrew 是否还在您的计算机上安装了 quantlib-config 脚本。如果是这样,它应该提供您需要的开关;尝试运行

quantlib-config --cflags

应该输出指定 QuantLib 标头位置的 -I 标志(可能还有您手动传递的 -std=c++11 标志),并且

quantlib-config --libs

应该输出相应的-L 开关以及您错过的-lQuantLib

如果他们工作,你可以使用命令

clang++ ql_ex1.cpp -o build/ql_ex1 $(INC) $(LIB) \
-I/opt/homebrew/Cellar/boost/1.76.0/include \
`quantlib-config --cflags` `quantlib-config --libs`

并让脚本为您填写信息。

【讨论】:

以上是关于链接到 MacOS 上预编译的 QuantLib 二进制文件时未定义的 Boost 符号的主要内容,如果未能解决你的问题,请参考以下文章

带有 Puma 和 Nginx 服务页面的 Elastic Beanstalk 上预编译资产的 Rails 4 应用程序以及旧资产链接

QuantLib金融库的简易安装

如何解决极其缓慢的 rake assets:在 heroku 上预编译?

Qt 交叉编译 Linux -> MacOS 无法链接到 Qt 库

在 Heroku 上预编译资产时如何普遍跳过数据库接触

Rails 4 - 在生产服务器上预编译资产后没有 manifest.json