eclipse g++没有损坏函数名

eclipse g++ not mangling function name

本文关键字:函数 损坏 g++ eclipse      更新时间:2023-10-16

我正在使用的C++模块包含一个函数(FitSpectrumNaIU),该函数调用另外两个函数(quacal和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)

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

该代码编译良好,并成为库的一部分,该库随后与主例程链接。然而,在与Eclipse g++链接的过程中出现了一个问题。当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"。