我是C ++的新手(很久以前就已经知道了),并且正在点击“使用C ++进行财务中的数值方法”。我无法得到其中一个例子。这是非常接近本书的开头,所以不应该很难,但我正在做他们正在做的事情并且收到错误。我已经看过类似的问题,但我不认为我和其他人一样犯了同样的错误(因为我很多人都不愿意阅读)。我已经在BinModel cpp文件中定义了我的函数,并且只是声明它们存在于.h文件中,所以我不知道为什么会出现重复错误?整个编译/运行对我来说有点神秘,所以如果有人知道在哪里找到对这些东西的真正基本的介绍,那么这也将是很好的。我目前在Mac上使用Code :: Blocks,我放弃了Xcode。这是我的代码:
BinModel.01.cpp
#include <iostream>
#include <cmath>
using namespace std;
double RiskNeutProb(double U, double D, double R)
{
return (R-D)/(U-D);
}
double S(double S0, double U, double D, int n, int i)
{
return S0*pow(1+U,i)*pow(1+D,n-i);
}
int GetInputData(double& S0, double& U, double& D, double& R)
{
//entering data
cout << "Enter S0: "; cin >> S0;
cout << "Enter U: "; cin >> U;
cout << "Enter D: "; cin >> D;
cout << "Enter R: "; cin >> R;
cout << endl;
//check range
if (S0<=0.0 || U<=-1.0 || D<=-1.0 || U<=D || R<=-1.0)
{
cout << "Illegal data ranges" << endl;
cout << "terminating program" << endl;
return 1;
}
//check arbitrage
if (R>=U || R<=D)
{
cout << "Arbitrage exists" << endl;
cout << "Terminating program" << endl;
return 1;
}
cout << "Input data checked" << endl;
cout << "There is no arbitrage" << endl;
return 0;
}
BinModel01.h
#ifndef BinModel01_h
#define BinModel01_h
double RiskNeutProb(double U, double D, double R);
double S(double S0, double U, double D, int n, int i);
int GetInputData(double& S0, double& U, double& D, double& R);
#endif // BinModel01_h
和Main04.cpp
#include "BinModel01.h"
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
double S0,U,D,R;
if (GetInputData(S0,U,D,R)==1) return 1;
//compute risk neutral prob
cout << "q= " << RiskNeutProb(U,D,R) << endl;
//stock price at node n=3,i=2
int n=3; int i=2;
cout << "n= " << n << endl;
cout << "i= " << i << endl;
cout << "S(n,i)= " << S(S0,U,D,n,i) << endl;
return 0;
}
错误:
g++ -o bin/Debug/Binomial obj/Debug/BinModel01.o obj/Debug/BinModel01.o obj/Debug/Main04.o obj/Debug/Main04.o
duplicate symbol __Z12RiskNeutProbddd in:
obj/Debug/BinModel01.o
duplicate symbol __Z1Sdddii in:
obj/Debug/BinModel01.o
duplicate symbol __Z12GetInputDataRdS_S_S_ in:
obj/Debug/BinModel01.o
duplicate symbol _main in:
obj/Debug/Main04.o
ld: 4 duplicate symbols for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
答案 0 :(得分:3)
这是你的链接器命令:
g++ -o bin/Debug/Binomial \
obj/Debug/BinModel01.o \
obj/Debug/BinModel01.o \
obj/Debug/Main04.o \
obj/Debug/Main04.o
它将文件链接两次,因此您将获得重复项。错误将出现在您的Makefile中,或者您正在构建的任何内容中。
答案 1 :(得分:2)
g++ -o bin/Debug/Binomial obj/Debug/BinModel01.o obj/Debug/BinModel01.o obj/Debug/Main04.o obj/Debug/Main04.o
^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^
您将此对象链接了两次。
所以,是的,你会得到重复的符号错误。
答案 2 :(得分:1)
g++ -o bin/Debug/Binomial obj/Debug/BinModel01.o obj/Debug/BinModel01.o obj/Debug/Main04.o obj/Debug/Main04.o
你不应该两次链接文件。