簡體   English   中英

將C ++源代碼用於f2py時的未定義符號

[英]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.cfoo.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.

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