2016-12-08 8 views
0

我通過ubuntu16.04安裝升壓易於得到來自官方源安裝 然後按照QuantLibquantlib多個defininition:performCalculations()const的」

的安裝指南,然後我複製。其中一個quantlib示例(Examples/EquityOption)創建我自己的項目,我在testoption.cpp和testoption.cpp中創建一個類,現在我有三個文件(testoption.hpp,testoption.cpp和EquityOption.cpp)

in 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 

whre我把它和鏈接編譯成QuantLib,錯誤emessage彈出:

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 of QuantLib :: MultiCurveSensitivities :: performCalculations()const' CMakeFiles/EquityOption.dir/EquityOption.cpp.o:/ usr/local/include/ql/experimental/termstructure s/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 of QuantLib :: MultiCurveSensitivities :: allZeros()const' CMakeFiles/EquityOption.dir/EquityOption.cpp.o :/usr/local/include/ql/experimental/termstructures/multicurvesensitivities.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 of QuantLib :: 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 of QuantLib :: MultiCurveSensitivities :: inverseSensitivities()const' CMakeFiles/Eq uityOption.dir/EquityOption.cpp.o:/usr/local/include/ql/experimental/termstructures/multicurvesensitivities.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 of QuantLib: :MultiCurveSensitivities :: allNodes()const' CMakeFiles/EquityOption.dir/EquityOption.cpp.o:/usr/local/include/ql/experimental/termstructures/multicurvesensitivities.hpp:139:此處首先定義 collect2:error: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?另一種解決方案,但˚F ailed。 我對C++相當陌生,我是否還需要修改源頭文件以使內聯並重新編譯quantlib(在筆記本電腦上使用-j 4選項需要將近20分鐘)?

回答

1

修改ql/experimental/terstrutures/multicurvesensitivities.hpp並且使類Multicurvesensitivities的成員函數內聯函數並複製到默認包含路徑(在ubuntu 16.04中它是/ usr/local/include/ql/experimental/terstructures)解決了問題。

+0

確認。值得一提的是,這個問題在git倉庫中得到了解決。另一個解決方法(不管問題可能是個好主意)將不包括全局頭文件'ql/quantlib.hpp',而只包含您需要的特定頭文件。這將進一步減少編譯時間。 –

+0

另外,修改後運行'make'和'make install'可能比手工複製標題更安全。只有少數文件會受到影響並重新編譯,因此不會像原始編譯那樣長。 –