簡體   English   中英

如何包裝C ++函數?

[英]How to wrap a C++ function?

通過遵循教程,我試圖包裝一個名為i_receive()c++函數,我首先創建了wrap.c文件,該文件的內容如下所示:

int i_receive(const uint32_t *f, int32_t t){

    static int (*real_i_receive)(const uint32_t *, int32_t)=NULL;
    printf("hello world");
    return real_i_receive;
}

當我使用LD_PRELOADLD_PRELOAD=/full/path/to/wrap.so ./mycppcode運行某些C ++代碼時,我使用gcc -fPIC -shared -o wrap.so wrap.c -ldl編譯了此文件。信息:

錯誤:ld.so:無法預加載來自LD_PRELOAD的對象'/full/path/to/wrap.so':已忽略。

我猜測原因可能是包裝文件是C文件,並且我將其與C ++代碼一起使用,對嗎?

我將文件更改為具有相同內容的wrap.cc ,以與以前相同的方式編譯時,我得到:

錯誤:從'int (*)(const uint32_t*, int32_t)' to 'int'無效轉換

更換

return real_i_receive;

return real_i_receive(f, t);

實際上,函數的返回類型為int但您正在返回函數指針。

首先,您遇到的第二個錯誤是您將指針返回給函數類型而不是int類型。

如果要返回一個int,請從代碼中調用該函數:

return real_i_receive(f,t);

注意“()”,它表示函數調用。

關於您的猜測:無論您使用的是C還是C ++代碼,這些庫都是匯編代碼。

導出C函數和C ++函數之間的區別是名稱修改。 您寧願將函數導出為C函數,以便能夠通過未修飾的名稱在庫中訪問它。

要導出不帶名稱修飾功能的函數,可以使用extern“ C”。

暫無
暫無

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

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