我从官方源码通过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: In function 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: first defined here CMakeFiles/EquityOption.dir/ATestClass.cpp.o: In function 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/multicurvesensitivities.hpp:151: first在此处定义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/multicurvesensitivities.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/multicurvesensitivities.hpp:134中:first defined here CMakeFiles/EquityOption.dir/ATestClass.cpp.o: In function 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: first defined here collect2: error: ld returned 1 exit status 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++的新手,我是否还需要修改源码的头文件,使其内联并重新编译-j库(在我的笔记本电脑上使用quantlib 4选项需要将近20分钟)?
发布于 2016-12-09 15:00:27
修改ql/experimental/terstrutures/multicurvesensitivities.hpp并使多曲线敏感类的成员函数成为内联函数并复制到默认的包含路径(在ubuntu16.04中,它的/usr/local/include/ql/experimental/terstructures)解决了这个问题。
https://stackoverflow.com/questions/41033287
复制相似问题