我正在使用的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下以相同的形式正确链接,我不知道下一步该尝试什么。有什么想法吗?
答案 0 :(得分:0)
听起来mrqmin在编译时至少在一个声明中被声明为extern“C”。这导致编译器该函数应该使用C样式链接,其中包括不对其进行修改。
我不确定为什么VS 2012没有出现同样的问题,但它可能与某种标题包含顺序有关。我将运行它编译的源文件以及通过g ++中的预处理器(使用-E)和VS2012(不确定如何)使用它的源文件,并查看两者中是否存在extern“C”。