函数名在库中更改

时间:2013-01-12 09:03:19

标签: c++

我有一个小查询,如下所示。

我已从下面的代码中创建了一个共享库。

help.h

#include<iostream>
#include<signal.h>
#include<unistd.h>

using namespace std;

void killMe(int sig_num);

void printMe(void);

help.cpp

#include<iostream>
#include<signal.h>
#include<unistd.h>

using namespace std;

void killMe(int sig_num)
{
    cout<<"Timeout occurred."<<endl;
    raise(SIGKILL);
}

void printMe()
{
    cout<<"This is help.cpp"<<endl;
}

[root@localhost DL]# nm -n /usr/local/lib/libmyhelp.so | grep " T "
00000584 T _init
00000760 T _Z6killMei
000007ae T _Z7printMev
00000864 T _fini
[root@localhost DL]#

检查nm的输出,我看到killMe和printMe函数的名称已经改变了一点。有没有办法在共享库中保留与cpp代码中相同的名称?感谢。

2 个答案:

答案 0 :(得分:3)

这是由于C++ name mangling。要将其关闭,请将函数声明为extern "C"

<强> help.h:

#include<iostream>
#include<signal.h>
#include<unistd.h>

using namespace std;

extern "C" {

void killMe(int sig_num);

void printMe(void);

}

答案 1 :(得分:1)

如果您将extern "C"添加到实现中,它应该可以正常工作。 help.h文件不参与编译过程。但是,有一种更好的方法:#include "help.h"作为cpp文件中的第一行,它验证它可以自己包含,并且头文件中声明的函数的定义匹配。

更多说明:

  • 你缺少包括警卫。
  • 标记空参数列表的void在C ++中是多余的,但不在C中。
  • 我要调用头文件help.hpp,以便明确它是C ++。
  • 您还可以删除iostream include,然后使其与C兼容。然后,您必须处理从C ++代码中抛出异常的情况,这在C中不能发生。