在命令行上手动构建
如果您没有将SWIG步骤添加到makefile中,您可以使用以下命令构建SWIG扩展(如果您有source_file.cpp和your_extension.i来创建Python模块):
swig -c++ -python -o your_extension_wrap.cpp your_extension.i
g++ -fPIC -c your_extension_wrap.cpp source_file.cpp -I/usr/include/python2.7
g++ -shared your_extension_wrap.o source_file.o -o _your_extension.so
注意: 对于共享对象的名称,重要的是在前面加上下划线,否则当执行import your_extension时,Python将无法找到它。
将SWIG添加到Autoconf
我用Python编写了一个小程序,其中需要一个单独的C ++文件(例如舍入方法)。
您需要额外的Autoconf宏来启用SWIG支持。正如johanvdw所指出的那样,如果您使用这两个m4宏:ax_pck_swig和ax_swig_python,将更容易。我从Autoconf Macro Archive下载并将其放置在项目树的m4子目录中:
trunk
├── configure.ac
├── __init__.py
├── m4
│ ├── ax_pkg_swig.m4
│ ├── ax_swig_python.m4
│ ├── libtool.m4
│ ├── lt~obsolete.m4
│ ├── ltoptions.m4
│ ├── ltsugar.m4
│ └── ltversion.m4
├── Makefile.am
├── rounding_swig
│ ├── compile.txt
│ ├── __init__.py
│ ├── Makefile.am
│ ├── rnd_C.cpp
│ ├── rounding.i
│ ├── rounding_wrap.cpp
└── src
├── cadna_add.py
├── cadna_computedzero.py
├── cadna_convert.py
├── __init__.py
└── Makefile.am
当您将两个m4宏放在子目录中时,您需要将此行添加到trunk/Makefile.am中:
ACLOCAL_AMFLAGS = -I m4
现在,让我们看一下 trunk/configure.ac :
AC_PREREQ([2.69])
AC_INIT(CADNA_PY, 1.0.0, cadna-team@lip6.fr)
AC_CONFIG_SRCDIR([rounding_swig/rnd_C.cpp])
AC_CONFIG_MACRO_DIR(m4)
AC_CONFIG_HEADERS(config.h)
AM_INIT_AUTOMAKE
AC_DISABLE_STATIC
AC_PROG_LIBTOOL
AC_PROG_CXX
AM_PATH_PYTHON(2.3)
AX_PKG_SWIG(1.3.21)
AX_SWIG_ENABLE_CXX
AX_SWIG_PYTHON
AC_CHECK_HEADERS([fenv.h stdlib.h string.h])
AC_CHECK_HEADER_STDBOOL
AC_TYPE_SIZE_T
AC_FUNC_MALLOC
AC_CHECK_FUNCS([fesetround memset strstr])
AC_CONFIG_FILES([
Makefile
src/Makefile
rounding_swig/Makefile
])
LIBPYTHON="python$PYTHON_VERSION"
LDFLAGS="$LDFLAGS -l$LIBPYTHON"
AC_OUTPUT
在Automake中添加SWIG
在您的trunk/Makefile.am文件中,您需要执行以下操作:
ACLOCAL_AMFLAGS = -I m4
# Indicate the subdir of c++ file and python file
SUBDIRS = src rounding_swig
# Indicate a list of all the files that are part of the package, but
# are not installed by default and were not specified in any other way
EXTRA_DIST= \
rounding_swig/rounding.i \
rounding_swig/testrounding.py \
rounding_swig/testrounding.cpp
在你的 trunk/src/Makefile.am 文件中:
# Python source files that will be install in prefix/lib/name_of_your_python_interpreter/site-packages/name_of_your_project
pkgpython_PYTHON = cadna_add.py cadna_computedzero.py cadna_convert.py
困难的部分在trunk/rounding_swig/Makefile.am中。它创建了一个库.la和一个_your_extension.so,并将其放置在prefix/lib64/python2.7/site-packages/name_of_the_project/。
BUILT_SOURCES = rounding_wrap.cpp
SWIG_SOURCES = rounding.i
pkgpython_PYTHON = rounding.py __init__.py
pkgpyexec_LTLIBRARIES = _rounding.la
_rounding_la_SOURCES = rounding_wrap.cpp $(SWIG_SOURCES) rnd_C.cpp
_rounding_la_CPPFLAGS = $(AX_SWIG_PYTHON_CPPFLAGS) -I$(top_srcdir)/rounding_swig -I/usr/include/python@PYTHON_VERSION@ -lpython@PYTHON_VERSION@
_rounding_la_LDFLAGS = -module
rounding_wrap.cpp: $(SWIG_SOURCES)
$(SWIG) $(AX_SWIG_PYTHON_OPT) -I$(top_srcdir)/rounding_swig -I/usr/include/python@PYTHON_VERSION@ -o $@ $<
最后,如果你没有其他5个宏命令,你可以通过输入以下内容获得它们:
autoreconf -i
最后,安装您的项目:
libtoolize && aclocal && autoheader && autoconf && automake -a -c
./configure --prefix=<install prefix>
make
make install
PS:这里是一个过时但简单的教程,帮助了我(过时是因为它使用的ac_pkg_swig.m4在新版本的swig中失败)。
pkgpythondir_DATA = foo.py
。 - Jack Kelly