ld:4个用于体系结构x86_64的重复符号

时间:2016-01-13 17:57:17

标签: c++

我是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)

3 个答案:

答案 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

你不应该两次链接文件。