簡體   English   中英

庫中的函數名稱已更改

[英]Function name changed in library

我有一個小的查詢,如下所示。

我從下面的代碼創建了一個共享庫。

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代碼中相同的名稱? 謝謝。

這是由於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);

}

如果也將extern "C"添加到實現中,它應該可以工作。 help.h文件不參與編譯過程。 但是,有一種更好的方法: #include "help.h"作為cpp文件的第一行,它驗證它可以自己包含並且在頭文件中聲明的函數定義匹配。

更多注意事項:

  • 你缺乏包括警衛。
  • 在C ++中,標記空參數列表的void是多余的,但在C中則不是。
  • 我將調用頭文件help.hpp,以使其清楚是C ++。
  • 您還可以刪除iostream包含,然后使其與C兼容。然后,您將不得不處理從C ++代碼引發異常的情況,這種情況在C語言中一定不能發生。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM