链接到 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 应用程序以及旧资产链接
如何解决极其缓慢的 rake assets:在 heroku 上预编译?