感谢这个问题已被提出并回答了几个案例,但我仍然遇到问题。我的目录结构如下:
models/
bs/
__init__.py
values.py
optlib/
Makefile
bin/
optlib.so # generated after compilation/linking
libstdc++-6.dll
inc/
optlib.h
stats.h
obj/
optlib.o # generated after compilation/linking
stats.o # generated after compilation/linking
src/
optlib.cc
stats.cc
简而言之,我的源文件位于src
,inc
中的头文件,目标文件输出到obj
,共享库文件输出到bin
。
我使用以下命令(从Makefile
中提取)编译和链接了C / C ++库:
g++ -c -Iinc -o obj/optlib.o src/optlib.cc
g++ -c -Iinc -o obj/stats.o src/stats.cc
g++ -shared -Wl,-soname,bin/optlib.so -o bin/optlib.so obj/optlib.o obj/stats.o
我在Windows 7计算机上使用MinGW并尝试使用ctypes
从Python访问共享库。我已将libstdc++-6.dll
C:\MinGW\bin
文件放入包含共享库bin
的{{1}}目录,optlib.so
正如许多帖子所示。
我的Python代码如下(注意__init__.py
导入values.py
):
# neither the os.path.abspath method of building the path works...
fn = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', 'optlib', 'bin', 'optlib.so'))
print type(fn) # returns <type 'unicode'>
# or actually implicitly typing it out
#fn= u'C:\\Users\\striji\\Desktop\\models\\optlib\\bin\\optlib.so'
LOAD_WITH_ALTERED_SEARCH_PATH=0x00000008
kernel32 = WinDLL('kernel32')
kernel32.LoadLibraryExW.restype = c_void_p
hMod = kernel32.LoadLibraryExW(fn, None, LOAD_WITH_ALTERED_SEARCH_PATH)
lib = CDLL(fn, handle=hMod)
def fcn(x):
lib.c_func.argtypes = [c_double]
lib.c_func.restype = c_double
x = byref(c_double(x))
return lib.c_func(x)
当我尝试使用以下内容导入模块时:
>>> from models import bs
我收到以下错误:
C:\MinGW\bin
位于我的PATH
变量上。实际上C++
包含在extern "C"
中的源代码,以便ctypes
可以看到它。这些是非常简单的C++
函数。如果您需要查看来源,我可以发帖。
然后问题是双重的。首先,我如何解决眼前的问题。第二,是否有可能简化编译和链接过程,因此它与系统无关(即在Mac OSX和Linux上编译和链接)?