Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
日食g++;不损坏函数名 一个我正在使用的C++模块包含一个函数(FielStimulnIu),它调用两个其他函数(四元和MRQmin),并且在调用函数的第一行包含了被调用函数的原型: /*++ analyze spectral data */ int FitSpectrumNaIU(long iNumChans, long *pSpectrum, double dGain, double dZero, double *dCentroid, double *dFWHM, double *dArea, double *dError) { double quadcal(double ax, double ay, double bx, double by, double cx, double cy); int mrqmin(double *x,double *y,double *sig,int npt,double *a,int *ia, int ma, double **covar, double **alpha, double *chisq, void (*funcs)(double, double*, double*, double*, int), double *alamda); ... (body of FitSpectrumNaIU)_C++_Eclipse_Eclipse Cdt_Name Mangling - Fatal编程技术网

日食g++;不损坏函数名 一个我正在使用的C++模块包含一个函数(FielStimulnIu),它调用两个其他函数(四元和MRQmin),并且在调用函数的第一行包含了被调用函数的原型: /*++ analyze spectral data */ int FitSpectrumNaIU(long iNumChans, long *pSpectrum, double dGain, double dZero, double *dCentroid, double *dFWHM, double *dArea, double *dError) { double quadcal(double ax, double ay, double bx, double by, double cx, double cy); int mrqmin(double *x,double *y,double *sig,int npt,double *a,int *ia, int ma, double **covar, double **alpha, double *chisq, void (*funcs)(double, double*, double*, double*, int), double *alamda); ... (body of FitSpectrumNaIU)

日食g++;不损坏函数名 一个我正在使用的C++模块包含一个函数(FielStimulnIu),它调用两个其他函数(四元和MRQmin),并且在调用函数的第一行包含了被调用函数的原型: /*++ analyze spectral data */ int FitSpectrumNaIU(long iNumChans, long *pSpectrum, double dGain, double dZero, double *dCentroid, double *dFWHM, double *dArea, double *dError) { double quadcal(double ax, double ay, double bx, double by, double cx, double cy); int mrqmin(double *x,double *y,double *sig,int npt,double *a,int *ia, int ma, double **covar, double **alpha, double *chisq, void (*funcs)(double, double*, double*, double*, int), double *alamda); ... (body of FitSpectrumNaIU),c++,eclipse,eclipse-cdt,name-mangling,C++,Eclipse,Eclipse Cdt,Name Mangling,mrqmin()和quadcal()稍后在源文件中定义 代码编译良好,并成为随后与主例程链接的库的一部分。但是,在与EclipseG++链接期间出现了一个问题。mrqmin()例程的名称在放入存档时不会被损坏,因此链接器找不到它。库的objdump,带有mrqmin的grep(只显示函数定义–还显示了静态声明,所有声明都已损坏),如下所示: 00000000 *UND* 00000000 _Z6mrqminPdS_S_iS_PiiPS_S1_S_PFvdS_S_S_iES_ 0

mrqmin()和quadcal()稍后在源文件中定义

代码编译良好,并成为随后与主例程链接的库的一部分。但是,在与EclipseG++链接期间出现了一个问题。mrqmin()例程的名称在放入存档时不会被损坏,因此链接器找不到它。库的objdump,带有mrqmin的grep(只显示函数定义–还显示了静态声明,所有声明都已损坏),如下所示:

00000000         *UND*  00000000 _Z6mrqminPdS_S_iS_PiiPS_S1_S_PFvdS_S_S_iES_
000058c0 g     F .text  00000a24 mrqmin
函数名有一个损坏的版本,正如我所期望的那样,显示为引用但未定义,而名称的非混合版本标记为已定义。起初我认为一定是某个外部C语句导致了这种情况,但事实并非如此

我希望mrqmin和quadcal的处理方式相同,因为它们在代码中没有真正的定义差异,但quadcal的名称在归档文件(如下)中出现,并被链接器发现:

00009068 g     F .text  000002f0 _Z7quadcaldddddd

Eclipse是3.3.0版,CDT是4.0.1.x版,我不得不使用这些版本。在VS2012下,所有这些链接都以相同的形式正确链接,我不确定下一步要尝试什么。有什么想法吗?

听起来mrqmin在编译时至少在一个声明中声明为extern“C”。这会使编译器认为函数应该使用C风格的链接,其中包括不损坏它


我不确定为什么VS 2012不会出现同样的问题,但这可能与某种标题包含顺序有关。我将通过g++(使用-E)和VS2012(不确定如何)中的预处理器运行编译源文件和使用源文件的源文件,并查看两者中是否都存在外部“C”

听起来像是
mrqmin
在编译时被声明为
extern“C”
(但不是头)。这会使编译器认为函数应该使用C风格的链接,其中包括不损坏它。您应该检查声明和定义的位置以确定。谢谢。您的建议让我查看了一个头文件(在搜索中没有出现),其中包含一个包含冗余mrqmin()原型的外部“C”。移除原型解决了问题。(我告诉过别人这会让人大吃一惊。)@Dave:如果你把这个作为答案转发,那么我可以把它标记为已回答。顺便说一句:我觉得很有趣的是VS2012没有同样的问题。知道为什么吗?