【问题标题】:quantlib multiple defininition of "QuantLib::MulticurvesSensitivities:performCalculations() const'“QuantLib::MulticurvesSensitivities:performCalculations() const' 的 quantlib 多重定义
【发布时间】:2016-12-08 06:39:35
【问题描述】:

我通过官方来源的 apt-get install 在 ubuntu16.04 上安装 boost。 然后按照QuantLib 的安装指南进行操作

然后我复制一个 quantlib 示例(Examples/EquityOption)来创建我自己的项目,我在 testoption.cpp 和 testoption.cpp 中创建一个类,现在我有三个文件(testoption.hpp、testoption.cpp 和 EquityOption。 cpp)

在 testoption.hpp 中

#ifndef TESTOPTION_HPP
#define TESTOPTION_HPP
#include <ql/quantlib.hpp>
using namespace QuantLib
class testOption{
//class declaration
};
#endif

在EquityOption.cpp中

#include <ql/quantlib.hpp>
#include "testoption.hpp"
int main(int, char* [])
{
//some code here
}

在 testoption.cpp 中

#include "testoption.hpp"
//definition of member function in testOption

当我编译它并链接到 QuantLib 时,会弹出错误消息:

CMakeFiles/EquityOption.dir/ATestClass.cpp.o:在函数boost::function1<double, double>::get_vtable() const': /usr/local/include/boost/math/special_functions/detail/igamma_large.hpp:69: multiple definition ofQuantLib::MultiCurveSensitivities::performCalculations() const' CMakeFiles/EquityOption.dir/EquityOption.cpp.o:/usr/local/include/ql/experimental/termstructures/multicurvesensitivities.hpp:106:这里首先定义 CMakeFiles/EquityOption.dir/ATestClass.cpp.o:在函数QuantLib::MultiCurveSensitivities::allZeros() const': /usr/local/include/boost/math/special_functions/detail/igamma_large.hpp:112: multiple definition ofQuantLib::MultiCurveSensitivities::allZeros() const' CMakeFiles/EquityOption.dir/EquityOption.cpp.o:/usr/local/include/ql/experimental/termstructures/multicurvesensitive.hpp:151:这里首先定义 CMakeFiles/EquityOption.dir/ATestClass.cpp.o:在函数QuantLib::MultiCurveSensitivities::sensitivities() const': /usr/local/include/boost/math/special_functions/detail/igamma_large.hpp:99: multiple definition ofQuantLib::MultiCurveSensitivities::sensitivities() const' CMakeFiles/EquityOption.dir/EquityOption.cpp.o:/usr/local/include/ql/experimental/termstructures/multicurvesensitive.hpp:129:这里首先定义 CMakeFiles/EquityOption.dir/ATestClass.cpp.o:在函数QuantLib::MultiCurveSensitivities::inverseSensitivities() const': /usr/local/include/boost/math/special_functions/detail/igamma_large.hpp:100: multiple definition ofQuantLib::MultiCurveSensitivities::inverseSensitivities() const' CMakeFiles/EquityOption.dir/EquityOption.cpp.o:/usr/local/include/ql/experimental/termstructures/multicurvesensitive.hpp:134:这里首先定义 CMakeFiles/EquityOption.dir/ATestClass.cpp.o:在函数QuantLib::MultiCurveSensitivities::allNodes() const': /usr/local/include/boost/math/special_functions/detail/igamma_large.hpp:101: multiple definition ofQuantLib::MultiCurveSensitivities::allNodes() const' CMakeFiles/EquityOption.dir/EquityOption.cpp.o:/usr/local/include/ql/experimental/termstructures/multicurvesensitivities.hpp:139:首先定义在这里 collect2:错误:ld 返回 1 个退出状态 CMakeFiles/EquityOption.dir/build.make:123:目标“EquityOption”的配方失败

我搜索了一下,发现了一个类似的问题: Build error using head revision of rquantlib with head revision of QuantLib and boost 1.56 我尝试了Why do I get a multiple definition error while linking? 的另一种解决方案,但失败了。 我对 c++ 很陌生,我是否还需要修改源头文件以使 mothed 内联并再次编译 quantlib(在我的笔记本电脑上使用 -j 4 选项需要将近 20 分钟)?

【问题讨论】:

    标签: c++ boost quantlib


    【解决方案1】:

    修改 ql/experimental/terstrutures/multicurvesensitivities.hpp 并将 Multicurvesensitivities 类的成员函数设置为内联函数并复制到默认包含路径(在 ubuntu 16.04 中为 /usr/local/include/ql/experimental/terstructures)解决了问题.

    【讨论】:

    • 已确认。值得一提的是,问题已在 git 存储库中得到解决。另一种解决方法(不管问题如何,这可能是一个好主意)是不包含全局标头ql/quantlib.hpp,而只包含您需要的特定标头。这将具有减少编译时间的进一步优势。
    • 另外,在修改后运行makemake install 可能比手动复制标题更安全。只有少数文件会受到影响并重新编译,因此不会像原始编译那样耗时。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多