0

我有一个小问题,如下所示。

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

帮助.h

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

using namespace std;

void killMe(int sig_num);

void printMe(void);

帮助.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 代码中相同的名称?谢谢。

4

2 回答 2

3

这是由于C++ name mangling造成的。要关闭它,请将函数声明为extern "C".

帮助.h:

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

using namespace std;

extern "C" {

void killMe(int sig_num);

void printMe(void);

}
于 2013-01-12T09:04:58.797 回答
1

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

还有一些注意事项:

  • 你缺少包括警卫。
  • 在 C++ 中标记空参数列表的 void 是多余的,尽管在 C 中不是。
  • 我会调用头文件 help.hpp 以明确它是 C++。
  • 您还可以删除 iostream 包含,然后使其与 C 兼容。然后您必须处理从 C++ 代码中抛出异常的情况,在 C 中使用时一定不能发生这种情况。
于 2013-01-12T09:43:14.327 回答