11

Linuxで共有ライブラリを作成するための私のCMake設定は次のようなものです

SET (CMAKE_CXX_FLAGS "-fPIC")

SET (LIB_UTILS_SRC
    Utils.cpp
)

ADD_LIBRARY (UTILS SHARED
    ${LIB_UTILS_SRC}
)

ソースUtils.cpp

double addTwoNumber(double x, double y)
{
    return x + y;
}

次のようなCTypeを使用して'addTwoNumber'関数にアクセスしようとすると

import os
import ctypes as c

libPath = '/home/AP/workspace/LearningCPP/lib/libUTILS.so'
libUTILS = c.cdll.LoadLibrary(libPath)

prototype = c.CFUNCTYPE(    
    c.c_double,                
    c.c_double,                
    c.c_double                
)
addTwoNumber = prototype(('addTwoNumber', libUTILS))

res = addTwoNumber(c.c_double(2.3), c.c_double(3.5) )

のようなメッセージが表示されます。

AttributeError: /home/AP/workspace/LearningCPP/lib/libUTILS.so:
undefined symbol: addTwoNumber

「nm--demanglelibUTILS.so」コマンドを使用してlibUTILS.soを確認したところ、「addTwoNumber」記号がはっきりと表示されています。

Pythonから「未定義のシンボル」メッセージが表示されるのはなぜですか?シンボルが正しくマングルされるように、いくつかのコンパイラフラグを設定する必要があると思います。任意の提案をいただければ幸いです!

4

1 に答える 1

18

興味深いことに、私はnumpy.ctypes常に大きなデータセットを処理する必要があり、問題が発生したことはないので、通常使用しますが、ここで何が起こっているかはわかっていると思います。名前がg ++コンパイラによって変更されているため、次のように機能させました。

Makefile:

g++ -Wall -fPIC -O2 -c Utils.cpp
g++ -shared -Wl -o libUTILS.so Utils.o

Utils.cpp

extern "C" double addTwoNumber(double x, double y)
{
    return x + y;
}

test.py

import os
import ctypes as c

libUTILS = c.cdll.LoadLibrary('libUTILS.so')

prototype = c.CFUNCTYPE(    
    c.c_double,                
    c.c_double,                
    c.c_double                
)
addTwoNumber = prototype(('addTwoNumber', libUTILS))

res = addTwoNumber(c.c_double(2.3), c.c_double(3.5) )
print res

出力:

$ python test.py
5.8

キーワードに注意してください。externこれにより、コンパイラが名前を壊さないようになります。Windowsの下では、追加の作業を行う必要があります。http://wolfprojects.altervista.org/dllforpyinc.phpは興味深いものでした。

これがお役に立てば幸いです。

私のマシン:

$ g ++ --version
i686-apple-darwin10-g ++-4.2.1(GCC)4.2.1(Apple Inc.ビルド5666)(ドット3)Copyright(C)2007 Free Software Foundation、Inc.これはフリーソフトウェアです。コピー条件については、ソースを参照してください。保証はありません。商品性や特定の目的への適合性についてもそうではありません。

$ uname -a
Darwin MacBookPro 10.8.0 Darwinカーネルバージョン10.8.0:Tue Jun 7 16:33:36 PDT 2011; ルート:xnu-1504.15.3〜1 / RELEASE_I386 i386

于 2012-06-28T02:16:37.963 に答える