[英]Undefined symbol when using C++ source for f2py
我可以用f2py
包裝一個C函數,如下所示:
foo.c的
#include <stdio.h>
void func(int n, int * a) {
printf("%d\n", n);
}
對應的接口文件是
foo.pyf
python module foo
interface
subroutine func(n, a)
intent(c) func
intent(c)
integer, intent(hide) :: n = shape(a,0)
real(kind=8), dimension(n), intent(in) :: a
end subroutine func
end interface
end python module foo
然后,我執行f2py foo.pyf -c foo.c -m foo
,這將創建Python庫,例如代碼
import numpy as np
import foo
foo.func( np.ones(3) )
如您所願打印3
。
foo.c
→ foo.cpp
導致未定義符號 通過將foo.c
的擴展名更改為foo.cpp
,我注意到
f2py foo.pyf -c foo.cpp -m foo
調用g++
而不是gcc
。 精細。 但是,在執行之后,在Python中import foo
時,我看到:
Traceback (most recent call last):
File "<string>", line 1, in <module>
ImportError: ./foo.so: undefined symbol: func_
我必須運用什么魔術才能使f2py
與C ++代碼f2py
工作? 可能嗎?
附加說明:
如果刪除接口文件中的intent(c) foo
行,則foo.c
產生相同的行為,即,從f2py
導入時,使用f2py
編譯f2py
產生相同的未定義符號錯誤。
嗯,這幾乎可以肯定是名稱修改的問題。
為了區分C ++甚至允許非類函數使用的重載名稱,C ++名稱與它們的“ C”名稱相比,在鏈接器中保留的名稱要復雜得多。
您可以將函數聲明為extern "C"
以便使用C命名約定將其導出。 該函數的主體仍可以使用c ++功能,但是f2py或類似的對象應該可以看到它。
請注意,這將阻止您在該函數名稱上使用C ++名稱重載。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.