0

以下のような小さなクエリがあります。

以下のコードから共有ライブラリを作成しました。

help.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++ の名前マングリングによるものです。オフにするには、関数を として宣言します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);

}
于 2013-01-12T09:04:58.797 に答える
1

extern "C"も実装に追加すると、動作するはずです。help.h ファイルはコンパイル プロセスには関与しません。ただし、より良い方法があり#include "help.h"ます。cpp ファイルの最初の行として、それ自体を含めることができ、ヘッダー ファイルで宣言された関数の定義が一致することを確認します。

その他の注意事項:

  • インクルードガードがありません。
  • 空のパラメーター リストをマークする void は、C++ では冗長ですが、C では冗長です。
  • C++ であることを明確にするために、ヘッダー ファイルを help.hpp と呼びます。
  • また、iostream インクルードを削除して、C と互換性を持たせることもできます。その場合、C++ コードから例外がスローされた場合に対処する必要がありますが、これは C で使用するために発生してはなりません。
于 2013-01-12T09:43:14.327 に答える