我有一个小查询,如下所示。
我已从下面的代码中创建了一个共享库。
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代码中相同的名称?感谢。
答案 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文件中的第一行,它验证它可以自己包含,并且头文件中声明的函数的定义匹配。
更多说明: