您的位置:首页 > 其它

g++ 两个关于头文件编译问题

2013-10-05 11:52 253 查看
好吧,不得不说ProfessorDemko的C++forFE的project真是可以加速学习C++的好方法。当年本科时候在李文新老师的课上学C++最后也只是完成了POJ上《魔兽世界》的大作业,而且只考虑了下派生类、友类和虚构函数。其他东西,呵呵,早都忘了噜。

好了,废话不多说,开始讨论问题。

在terminal中用g++编译C++文件,遇到两个主要的问题,中文网页中很少有所讨论。卤煮在stackoverflow上倒是看到了不少这样的讨论,果然程序员的英文水平都很高>w<

头文件中类的构建函数

楼主将一个正态函数生成及相关计算的类写入了一个头文件,该头文件在其他文件和主文件中都会被调用。

头文件的代码如下

#ifndef_NORMDISTINTEGRAL_H__
#define_NORMDISTINTEGRAL_H__

/*GenerateNormalDistribution*/

#include<iostream>
#include<cmath>

constdoublePI=3.1415926;

classMyNormDist
{
doublemean;//themeanofNormalDistribution
doublestd_v;//standarddeviation
public:
MyNormDist(doublemean_,doublestd_v_);
~MyNormDist();
doubleNorm_pdf(doublex);//probabilitydensityfunction
doubleNorm_cdf(doublex);//cumlativedistributionfunction
doubleNorm_igral(constdouble&low_b,constdouble&up_b);//integral
};

#endif


与头文件同名的cpp文件中代码如下,主要对头文件类中的函数内容进行编写。

#include"NormDistIntegral.h"

usingnamespacestd;

MyNormDist::MyNormDist(doublemean_,doublestd_v_)
{
mean=mean_;
std_v=std_v_;
}

//MyNormDist::~MyNormDist(){}

/*省略以下描述函数代码*/


单独对该cpp文件进行g++编译是完全没有问题的。但是对主文件进行编译时(关联其他o文件),遇到了如下的问题。

Undefinedsymbolsforarchitecturex86_64:

"MyNormDist::~MyNormDist()",referencedfrom:
___tcf_2inCashFlow.o
___tcf_1inBSE.o
ld:symbol(s)notfoundforarchitecturex86_64
collect2:ldreturned1exitstatus

好吧,他说我析构函数没有找到。stackoverflow上给的解答是,析构函数的函数内容也应该在cpp文件中写出,而不应该省去。因为头文件仅仅是对类及类中得变量、函数进行声明。实际调用还是应该从cpp文件中调用的,因此就算析构函数没有具体内容,也应该在cpp文件中写出,即把上一段代码中第11行的注释dashes给去掉。

references:http://stackoverflow.com/questions/11488486/undefined-symbols-for-architecture-x86-64-compiling-inherited-class?rq=1

  2.文件调用

楼主还为主文件编写了个cpp文件getCMT.cpp,其中包含函数getCMT()以冀在主文件main.cpp和CashFlow.cpp中直接调用。可是编译主文件时,又报出了如下的错误

ld:duplicatesymbolgetCMT()
inCashFlow.oandmain.oforarchitecturex86_64


collect2:ldreturned1exitstatus


好吧,stackoverflow上给出的答案是,在多个其他cpp文件中直接用引用cpp文件时候,该cpp文件因为被多个文件include,这些文件的o文件都会得到这个函数的复制件。C++是禁止对同一函数进行多次定义的,linker可能会对此报错。

如何解决了,建议将这些函数体写到一个cpp文件中,并建立一个与cpp文件同名的的头文件,头文件仅仅对cpp文件中得函数进行声明。在其他文件中需要引用该函数的时候,include该头文件即可。

Reference:http://stackoverflow.com/questions/9299676/ld-duplicate-symbol


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐