答案就在对问题的评论和回答中。在
我试图为musly软件(C/C++)创建一个Python接口,更具体地说是针对LiBISLY,使用SWIG。我使用的构建目录是链接repo中的/libmusly目录,其中的/include目录来自同一个repo。在
我使用下面名为lib.I的swig接口,因为我要访问的方法在库.cpp文件。我会事先说,最后的部分让我觉得问题出在这个文件中。在
/* lib.i */
%module libmusly
%{
typedef struct {
void* method;
char* method_name;
void* decoder;
char* decoder_name; } musly_jukebox;
typedef float musly_track;
typedef int musly_trackid;
const char* musly_version();
void musly_debug(
int level);
const char* musly_jukebox_listmethods();
const char* musly_jukebox_listdecoders();
const char* musly_jukebox_aboutmethod(
musly_jukebox* jukebox);
musly_jukebox* musly_jukebox_poweron(
const char* method,
const char* decoder); int musly_jukebox_similarity(
musly_jukebox* jukebox,
musly_track* seed_track,
musly_trackid seed_trackid,
musly_track** tracks,
musly_trackid* trackids,
int num_tracks,
float* similarities);
musly_track* musly_track_alloc(
musly_jukebox* jukebox);
void musly_track_free(
musly_track* track);
int musly_track_size(
musly_jukebox* jukebox);
int musly_track_analyze_audiofile(
musly_jukebox* jukebox,
const char* audiofile,
float excerpt_length,
float excerpt_start,
musly_track* track);
%}
我正在使用以下文件来构建和链接它:
^{pr2}$标题中提到的,我可以将生成的模块导入到我链接的python解释器中,3.5m,没有错误。但是这个模块除了标准的方法之外没有其他方法,即以“u”(下划线)结尾,还有一些与swig相关的方法也以下划线开头和结尾。在
我确实尝试过引进诽谤和诽谤,前者总包含后者。它们里面的方法是不同的,但是同样的问题存在,我的方法都不存在。在
编译后目录中的文件为:
./:
build.sh
decoder.cpp
decoder.h
decoder.o
decoders
discretecosinetransform.cpp
discretecosinetransform.h
discretecosinetransform.o
files.txt
filterkit.o
gaussian.h
gaussianstatistics.cpp
gaussianstatistics.h
gaussianstatistics.o
idpool.h
include
kissfft
kiss_fft.o
kiss_fftr.o
libav.o
lib.cpp
lib.i
libmusly.py
libmusly_resample.so
_libmusly.so
lib.o
libresample
lib_wrap.cxx
lib_wrap.o
mandelellis.o
melspectrum.cpp
melspectrum.h
melspectrum.o
method.cpp
method.h
method.o
methods
mfcc.cpp
mfcc.h
mfcc.o
mutualproximity.cpp
mutualproximity.h
mutualproximity.o
plugins.cpp
plugins.h
plugins.o
powerspectrum.cpp
powerspectrum.h
powerspectrum.o
resample.o
resampler.cpp
resampler.h
resampler.o
resamplesubs.o
timbre.o
windowfunction.cpp
windowfunction.h
windowfunction.o
./decoders:
libav.cpp
libav.h
./include:
CMakeLists.txt
minilog.h
minilog.h.gch
musly
./include/musly:
musly.h
musly.h.gch
musly_types.h
./kissfft:
CHANGELOG
COPYING
kiss_fft.c
_kiss_fft_guts.h
kiss_fft.h
kiss_fftr.c
kiss_fftr.h
README
README.simd
TIPS
./libresample:
CMakeLists.txt
filterkit.c
filterkit.h
filterkit.o
libresample.h
LICENSE.txt
README.txt
resample.c
resample_defs.h
resample.o
resamplesubs.c
resamplesubs.o
./methods:
mandelellis.cpp
mandelellis.h
timbre.cpp
timbre.h
内容诽谤.py是:
# This file was automatically generated by SWIG (http://www.swig.org).
# Version 3.0.10
#
# Do not make changes to this file unless you know what you are doing--modify
# the SWIG interface file instead.
from sys import version_info as _swig_python_version_info
if _swig_python_version_info >= (2, 7, 0):
def swig_import_helper():
import importlib
pkg = __name__.rpartition('.')[0]
mname = '.'.join((pkg, '_libmusly')).lstrip('.')
try:
return importlib.import_module(mname)
except ImportError:
return importlib.import_module('_libmusly')
_libmusly = swig_import_helper()
del swig_import_helper
elif _swig_python_version_info >= (2, 6, 0):
def swig_import_helper():
from os.path import dirname
import imp
fp = None
try:
fp, pathname, description = imp.find_module('_libmusly', [dirname(__file__)])
except ImportError:
import _libmusly
return _libmusly
if fp is not None:
try:
_mod = imp.load_module('_libmusly', fp, pathname, description)
finally:
fp.close()
return _mod
_libmusly = swig_import_helper()
del swig_import_helper
else:
import _libmusly
del _swig_python_version_info
try:
_swig_property = property
except NameError:
pass # Python < 2.2 doesn't have 'property'.
try:
import builtins as __builtin__
except ImportError:
import __builtin__
def _swig_setattr_nondynamic(self, class_type, name, value, static=1):
if (name == "thisown"):
return self.this.own(value)
if (name == "this"):
if type(value).__name__ == 'SwigPyObject':
self.__dict__[name] = value
return
method = class_type.__swig_setmethods__.get(name, None)
if method:
return method(self, value)
if (not static):
if _newclass:
object.__setattr__(self, name, value)
else:
self.__dict__[name] = value
else:
raise AttributeError("You cannot add attributes to %s" % self)
def _swig_setattr(self, class_type, name, value):
return _swig_setattr_nondynamic(self, class_type, name, value, 0)
def _swig_getattr(self, class_type, name):
if (name == "thisown"):
return self.this.own()
method = class_type.__swig_getmethods__.get(name, None)
if method:
return method(self)
raise AttributeError("'%s' object has no attribute '%s'" % (class_type.__name__, name))
def _swig_repr(self):
try:
strthis = "proxy of " + self.this.__repr__()
except __builtin__.Exception:
strthis = ""
return "<%s.%s; %s >" % (self.__class__.__module__, self.__class__.__name__, strthis,)
try:
_object = object
_newclass = 1
except __builtin__.Exception:
class _object:
pass
_newclass = 0
# This file is compatible with both classic and new-style classes.
我在2013年的Intel i3上使用Debian 9,所有东西都是从回购安装的。Swig是版本3和c++6.3.0。swig文档推荐用c++编译c++,但我确实尝试了其他编译器,得到了相同的结果。在
当我试图将以下代码添加到/libmusly的末尾时/CMakeLists.txt文件编译我得到两个文件”诽谤.py“和”_诽谤。所以,我必须将前者重命名为_诽谤.py“结果却遇到了同样的问题。但是结果呢_诽谤。所以比我用另一种方法得到的要大得多,14,6MB对3,5MB。在
FIND_PACKAGE(SWIG REQUIRED) INCLUDE(${SWIG_USE_FILE})
FIND_PACKAGE(PythonLibs) INCLUDE_DIRECTORIES(${LIBMUSLY_INCLUDE} ${EIGEN3_INCLUDE_DIR} ${LIBAV_INCLUDE_DIRS} ${CMAKE_CURRENT_SOURCE_DIR} ${PYTHON_INCLUDE_PATH})
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})
SET(CMAKE_SWIG_FLAGS "")
SET_SOURCE_FILES_PROPERTIES(lib.i PROPERTIES CPLUSPLUS ON) SET_SOURCE_FILES_PROPERTIES(lib.i PROPERTIES SWIG_FLAGS "-includeall") SWIG_ADD_MODULE(libmusly python lib.i
kissfft/kiss_fft.c
kissfft/kiss_fftr.c
methods/mandelellis.cpp
methods/timbre.cpp
decoders/libav.cpp
resampler.cpp
plugins.cpp
method.cpp
decoder.cpp
windowfunction.cpp
powerspectrum.cpp
melspectrum.cpp
discretecosinetransform.cpp
mfcc.cpp
gaussianstatistics.cpp
mutualproximity.cpp
lib.cpp) SWIG_LINK_LIBRARIES(libmusly
${LIBMUSLY_LIBS}
${LIBAV_LIBRARIES}
${LIBMUSLY_EXTERNAL}
${PYTHON_LIBRARIES})
在%{ %}
块之前使用%inline
之后,我无法再导入结果模块。解释器会抱怨未定义的符号,即使它是在.i和.cpp文件中定义的。我想可能是链接错误,但我不知道是什么。错误:
Traceback (most recent call last):
File "/home/tuco/Desenvolvimento/libmusly_swig/libmusly.py", line 18, in swig_import_helper
return importlib.import_module(mname)
File "/usr/lib/python3.5/importlib/__init__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 986, in _gcd_import
File "<frozen importlib._bootstrap>", line 969, in _find_and_load
File "<frozen importlib._bootstrap>", line 958, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 666, in _load_unlocked
File "<frozen importlib._bootstrap>", line 577, in module_from_spec
File "<frozen importlib._bootstrap_external>", line 914, in create_module
File "<frozen importlib._bootstrap>", line 222, in _call_with_frames_removed
ImportError: /home/tuco/Desenvolvimento/libmusly_swig/_libmusly.so: undefined symbol: _Z26musly_jukebox_listdecodersv
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/home/tuco/Desenvolvimento/libmusly_swig/libmusly.py", line 21, in <module>
_libmusly = swig_import_helper()
File "/home/tuco/Desenvolvimento/libmusly_swig/libmusly.py", line 20, in swig_import_helper
return importlib.import_module('_libmusly')
File "/usr/lib/python3.5/importlib/__init__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
ImportError: /home/tuco/Desenvolvimento/libmusly_swig/_libmusly.so: undefined symbol: _Z26musly_jukebox_listdecodersv
新的诽谤.py在
# This file was automatically generated by SWIG (http://www.swig.org).
# Version 3.0.10
#
# Do not make changes to this file unless you know what you are doing--modify
# the SWIG interface file instead.
from sys import version_info as _swig_python_version_info
if _swig_python_version_info >= (2, 7, 0):
def swig_import_helper():
import importlib
pkg = __name__.rpartition('.')[0]
mname = '.'.join((pkg, '_libmusly')).lstrip('.')
try:
return importlib.import_module(mname)
except ImportError:
return importlib.import_module('_libmusly')
_libmusly = swig_import_helper()
del swig_import_helper
elif _swig_python_version_info >= (2, 6, 0):
def swig_import_helper():
from os.path import dirname
import imp
fp = None
try:
fp, pathname, description = imp.find_module('_libmusly', [dirname(__file__)])
except ImportError:
import _libmusly
return _libmusly
if fp is not None:
try:
_mod = imp.load_module('_libmusly', fp, pathname, description)
finally:
fp.close()
return _mod
_libmusly = swig_import_helper()
del swig_import_helper
else:
import _libmusly
del _swig_python_version_info
try:
_swig_property = property
except NameError:
pass # Python < 2.2 doesn't have 'property'.
try:
import builtins as __builtin__
except ImportError:
import __builtin__
def _swig_setattr_nondynamic(self, class_type, name, value, static=1):
if (name == "thisown"):
return self.this.own(value)
if (name == "this"):
if type(value).__name__ == 'SwigPyObject':
self.__dict__[name] = value
return
method = class_type.__swig_setmethods__.get(name, None)
if method:
return method(self, value)
if (not static):
if _newclass:
object.__setattr__(self, name, value)
else:
self.__dict__[name] = value
else:
raise AttributeError("You cannot add attributes to %s" % self)
def _swig_setattr(self, class_type, name, value):
return _swig_setattr_nondynamic(self, class_type, name, value, 0)
def _swig_getattr(self, class_type, name):
if (name == "thisown"):
return self.this.own()
method = class_type.__swig_getmethods__.get(name, None)
if method:
return method(self)
raise AttributeError("'%s' object has no attribute '%s'" % (class_type.__name__, name))
def _swig_repr(self):
try:
strthis = "proxy of " + self.this.__repr__()
except __builtin__.Exception:
strthis = ""
return "<%s.%s; %s >" % (self.__class__.__module__, self.__class__.__name__, strthis,)
try:
_object = object
_newclass = 1
except __builtin__.Exception:
class _object:
pass
_newclass = 0
class musly_jukebox(_object):
__swig_setmethods__ = {}
__setattr__ = lambda self, name, value: _swig_setattr(self, musly_jukebox, name, value)
__swig_getmethods__ = {}
__getattr__ = lambda self, name: _swig_getattr(self, musly_jukebox, name)
__repr__ = _swig_repr
__swig_setmethods__["method"] = _libmusly.musly_jukebox_method_set
__swig_getmethods__["method"] = _libmusly.musly_jukebox_method_get
if _newclass:
method = _swig_property(_libmusly.musly_jukebox_method_get, _libmusly.musly_jukebox_method_set)
__swig_setmethods__["method_name"] = _libmusly.musly_jukebox_method_name_set
__swig_getmethods__["method_name"] = _libmusly.musly_jukebox_method_name_get
if _newclass:
method_name = _swig_property(_libmusly.musly_jukebox_method_name_get, _libmusly.musly_jukebox_method_name_set)
__swig_setmethods__["decoder"] = _libmusly.musly_jukebox_decoder_set
__swig_getmethods__["decoder"] = _libmusly.musly_jukebox_decoder_get
if _newclass:
decoder = _swig_property(_libmusly.musly_jukebox_decoder_get, _libmusly.musly_jukebox_decoder_set)
__swig_setmethods__["decoder_name"] = _libmusly.musly_jukebox_decoder_name_set
__swig_getmethods__["decoder_name"] = _libmusly.musly_jukebox_decoder_name_get
if _newclass:
decoder_name = _swig_property(_libmusly.musly_jukebox_decoder_name_get, _libmusly.musly_jukebox_decoder_name_set)
def __init__(self):
this = _libmusly.new_musly_jukebox()
try:
self.this.append(this)
except __builtin__.Exception:
self.this = this
__swig_destroy__ = _libmusly.delete_musly_jukebox
__del__ = lambda self: None
musly_jukebox_swigregister = _libmusly.musly_jukebox_swigregister
musly_jukebox_swigregister(musly_jukebox)
def musly_version():
return _libmusly.musly_version()
musly_version = _libmusly.musly_version
def musly_debug(level):
return _libmusly.musly_debug(level)
musly_debug = _libmusly.musly_debug
def musly_jukebox_listmethods():
return _libmusly.musly_jukebox_listmethods()
musly_jukebox_listmethods = _libmusly.musly_jukebox_listmethods
#def musly_jukebox_listdecoders():
# return _libmusly.musly_jukebox_listdecoders()
#musly_jukebox_listdecoders = _libmusly.musly_jukebox_listdecoders
def musly_jukebox_aboutmethod(jukebox):
return _libmusly.musly_jukebox_aboutmethod(jukebox)
musly_jukebox_aboutmethod = _libmusly.musly_jukebox_aboutmethod
def musly_jukebox_poweron(method, decoder):
return _libmusly.musly_jukebox_poweron(method, decoder)
musly_jukebox_poweron = _libmusly.musly_jukebox_poweron
def musly_jukebox_similarity(jukebox, seed_track, seed_trackid, tracks, trackids, num_tracks, similarities):
return _libmusly.musly_jukebox_similarity(jukebox, seed_track, seed_trackid, tracks, trackids, num_tracks, similarities)
musly_jukebox_similarity = _libmusly.musly_jukebox_similarity
def musly_track_alloc(jukebox):
return _libmusly.musly_track_alloc(jukebox)
musly_track_alloc = _libmusly.musly_track_alloc
def musly_track_free(track):
return _libmusly.musly_track_free(track)
musly_track_free = _libmusly.musly_track_free
def musly_track_size(jukebox):
return _libmusly.musly_track_size(jukebox)
musly_track_size = _libmusly.musly_track_size
def musly_track_analyze_audiofile(jukebox, audiofile, excerpt_length, excerpt_start, track):
return _libmusly.musly_track_analyze_audiofile(jukebox, audiofile, excerpt_length, excerpt_start, track)
musly_track_analyze_audiofile = _libmusly.musly_track_analyze_audiofile
# This file is compatible with both classic and new-style classes.
在}之间的代码直接包含在包装器中,无需修改。SWIG解析模块级的代码,并创建包装器函数。例如:
.i
文件中,%{
和{您还可以执行
^{pr2}$%inline %{ %}
,它既声明又创建包装:相关问题 更多 >
编程相关推荐