如何将c编译器选项添加到distutils

时间:2014-05-21 19:04:05

标签: python c distutils

我想从C代码中调用Mathematica,从Python调用C代码。我有各自的部分工作,但我不能把所有东西放在一起。

当我编译调用Mathematica的C代码时,我在makefile中使用以下命令

$(CC) -O mlcall.c -I$(INCDIR) -L$(LIBDIR) -l${MLLIB} ${EXTRALIBS} -o $@

其中

MLINKDIR = /opt/Mathematica-9.0/SystemFiles/Links/MathLink/DeveloperKit
SYS=Linux-x86-64
CADDSDIR = ${MLINKDIR}/${SYS}/CompilerAdditions
INCDIR = ${CADDSDIR}
LIBDIR = ${CADDSDIR}
MLLIB = ML64i3

我的问题是如何使用具有相同选项的distutils(目前我正在获取未定义的符号:MLActivate错误,从Python调用时我认为问题是因为我没有使用这些选项)?

我看到了答案https://stackoverflow.com/a/16078447/1335014并尝试使用CFLAGS(通过运行以下脚本):

MLINKDIR=/opt/Mathematica-9.0/SystemFiles/Links/MathLink/DeveloperKit
SYS="Linux-x86-64"
CADDSDIR=${MLINKDIR}/${SYS}/CompilerAdditions
INCDIR=${CADDSDIR}
LIBDIR=${CADDSDIR}
MLLIB=ML64i3
EXTRALIBS="-lm -lpthread -lrt -lstdc++"
export CFLAGS="-I$INCDIR -L$LIBDIR -l${MLLIB} ${EXTRALIBS}"

所以我得到echo $CFLAGS

的以下输出
-I/opt/Mathematica-9.0/SystemFiles/Links/MathLink/DeveloperKit/Linux-x86-64/CompilerAdditions -L/opt/Mathematica-9.0/SystemFiles/Links/MathLink/DeveloperKit/Linux-x86-64/CompilerAdditions -lML64i3 -lm -lpthread -lrt -lstdc++

这似乎是正确的,但没有任何效果。也许是因为我添加了多个选项。

1 个答案:

答案 0 :(得分:0)

我意识到,如果你不修改C源代码,那么就不会编译任何内容(由于这个原因我原来的错误)。像我一样使用CFLAGS确实解决了这个问题。

在深入研究distutils文档后,我发现了两个额外的修补程序(这些只使用setup.py并且不需要任何环境变量)。

1:

from distutils.core import setup, Extension

module1 = Extension('spammodule',
                sources = ['spammodule.c'],
                extra_compile_args=["-I/opt/Mathematica-9.0/SystemFiles/Links/MathLink/DeveloperKit/Linux-x86-64/CompilerAdditions"],
                extra_link_args=["-L/opt/Mathematica-9.0/SystemFiles/Links/MathLink/DeveloperKit/Linux-x86-64/CompilerAdditions", "-lML64i3", "-lm", "-lpthread", "-lrt", "-lstdc++"])

setup (name = 'MyPackage',
                version = '1.0',
                description = 'This is a demo package',
                ext_modules = [module1])

2:

from distutils.core import setup, Extension

module1 = Extension('spammodule',
            sources = ['spammodule.c'],
            include_dirs=['/opt/Mathematica-9.0/SystemFiles/Links/MathLink/DeveloperKit/Linux-x86-64/CompilerAdditions'],
            library_dirs=['/opt/Mathematica-9.0/SystemFiles/Links/MathLink/DeveloperKit/Linux-x86-64/CompilerAdditions'],
            libraries=["ML64i3", "m", "pthread", "rt", "stdc++"])

setup (name = 'MyPackage',
            version = '1.0',
            description = 'This is a demo package',
            ext_modules = [module1])