g++ 两个关于头文件编译问题
2013-10-05 11:52
253 查看
好吧,不得不说ProfessorDemko的C++forFE的project真是可以加速学习C++的好方法。当年本科时候在李文新老师的课上学C++最后也只是完成了POJ上《魔兽世界》的大作业,而且只考虑了下派生类、友类和虚构函数。其他东西,呵呵,早都忘了噜。
好了,废话不多说,开始讨论问题。
在terminal中用g++编译C++文件,遇到两个主要的问题,中文网页中很少有所讨论。卤煮在stackoverflow上倒是看到了不少这样的讨论,果然程序员的英文水平都很高>w<
头文件中类的构建函数
楼主将一个正态函数生成及相关计算的类写入了一个头文件,该头文件在其他文件和主文件中都会被调用。
头文件的代码如下
与头文件同名的cpp文件中代码如下,主要对头文件类中的函数内容进行编写。
单独对该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中直接调用。可是编译主文件时,又报出了如下的错误
好吧,stackoverflow上给出的答案是,在多个其他cpp文件中直接用引用cpp文件时候,该cpp文件因为被多个文件include,这些文件的o文件都会得到这个函数的复制件。C++是禁止对同一函数进行多次定义的,linker可能会对此报错。
如何解决了,建议将这些函数体写到一个cpp文件中,并建立一个与cpp文件同名的的头文件,头文件仅仅对cpp文件中得函数进行声明。在其他文件中需要引用该函数的时候,include该头文件即可。
Reference:http://stackoverflow.com/questions/9299676/ld-duplicate-symbol
好了,废话不多说,开始讨论问题。
在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
相关文章推荐
- C语言学习4: 函数返回值与传入参数,关于函数值传递和类型隐性转换,变量不同的作用域,static变量,多文件编译例如两个C文件,显示函数调用语句跳转,递归,斐波那契数列,多文件编译相同变量的问题。
- 整理Linux下gcc编译中关于头文件与库文件搜索路径相关问题
- 关于nginx+cgi+cJSON在CentOS虚拟机上将c文件编译成cgi文件遇到的问题归纳
- 今天解决了两个关于.NET读取EXCEL文件的问题,记下来,很有用!
- 请教高手:关于在delphi中编译时对输出文件分类的问题?
- 关于vs编译后bin下的dll文件重新出现的问题
- 将C语言编译成DLL并用C#进行调用以及关于从C#传输中文路径到C的DLL中打开文件的问题
- 关于gitignore文件,Myeclipse和IDEA的编译输出文件的问题
- 两个关于.NET读取EXCEL文件的问题,记下来,很有用!
- Linux下gcc编译中关于头文件与库文件搜索路径相关问题
- 关于gcc编译产生可调试文件的打印变量问题
- 关于CMake编译生成的工程文件不能移动的问题
- linux下编程的gcc编译中关于头文件与库文件搜索路径相关问题(一)
- 关于gcc编译后文件体积的问题 也可以说是编译出Debug/Release的问题
- 今天解决了两个关于.NET读取EXCEL文件的问题,记下来,很有用!
- VS里面关于.cpp文件与.cu文件混合编译问题---不要在.cpp文件声明核函数(__device__()和global__())
- 关于编译问题--- 删除服务器文件导致本地文件缺失
- 关于将函数写入头文件问题(分离式编译)
- 关于在linux 下编译APK时,编译 AIDL文件问题
- Linux下gcc编译中关于头文件与库文件搜索路径相关问题(一)