[英]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_PRELOAD
以LD_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.