eclipse g ++没有修改函数名

时间:2014-04-24 15:26:55

标签: c++ eclipse eclipse-cdt name-mangling

我正在使用的C ++模块包含一个函数(FitSpectrumNaIU),它调用另外两个函数(quadcal和mrqmin),被调用函数的原型包含在contains函数的第一行之后:

/*++ 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,带有一个grep for mrqmin(只显示函数定义 - 还有静态声明出现,都被破坏了),看起来像这样:

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下以相同的形式正确链接,我不知道下一步该尝试什么。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

听起来mrqmin在编译时至少在一个声明中被声明为extern“C”。这导致编译器该函数应该使用C样式链接,其中包括不对其进行修改。

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