eclipse g++没有损坏函数名
eclipse g++ not mangling function name
我正在使用的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"。
相关文章:
- 动态构造函数中的新字符 [] 抛出"损坏的顶部大小";
- 调用std::函数成员时内存损坏
- 我的 c 字符串复制函数正在损坏其他变量的堆栈
- 构造函数初始化和对象损坏
- 动态分配时类构造函数中的堆损坏
- 从第三方库导出 cpp 损坏的函数
- 在使用新操作员和C 中的结构的调用构造函数时,获得内存损坏(Malloc)
- Win32 C API:替代损坏的execl*()系列函数?
- 对于我的类函数,我得到双重释放或损坏错误
- 堆损坏 c++ 返回表指针的函数
- 析构函数会导致堆损坏
- 为什么链表中的数据在嵌套函数中会更改/损坏?
- 有没有一种方法可以使用RTTI获得基于签名的typeinfo损坏的函数名
- 在向量中使用不带复制且没有 noexcept 移动构造函数的对象.实际损坏的内容以及我如何确认它
- 函数的返回类型是损坏名称的一部分吗?
- 当使用实例会员方法作为函数指针时,堆积损坏
- 从 dll 中的函数返回时堆损坏
- 在递归函数中释放内存时堆损坏
- 网关函数损坏了从matlab到c++mex程序的输入
- 我的双向链表中的查找函数损坏