我想使用distutils构建一个静态的Cython库。我不关心它是一个可以导入的真正的Python扩展模块。我只想编译代码并将对象放在静态库中。创建动态库的代码非常简单,
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
setup(
cmdclass = {'build_ext':build_ext},
ext_modules = [Extension("test",["test.pyx"])]
)
是否有一种简单的方法可以使其静止?
Distutils非常有限,不适用于静态构建。我建议你使用其他东西来编译项目的静态库部分。
如果你的用例是从其他C代码调用Cython代码,那么你想在你的Cython代码中使用public
or api
declarations以及cdef
声明的函数和变量。 Cython将允许从外部C代码调用如此声明的对象,它将为您生成.h
文件和.c
文件。
Fyi,这可以使用numpy distutils
,但显然远不及共享库的原始代码的简单性或可能的可移植性,
from Cython.Compiler.Main import compile
from numpy.distutils.misc_util import Configuration
compile('test.pyx')
config = Configuration(...)
config.add_installed_library('test',
['test.c'],
'test',
{'include_dirs':[get_python_inc()]})
假设你的setup.py中有sources
,include_dirs
和build_dir
,这就是构建静态库的方法
from distutils.ccompiler import new_compiler
from sysconfig import get_paths
import os
project_name = "slimey_project"
source = ['source1.c']
include_dirs = ['include']
build_dir = os.path.join(os.path.dirname(__file__), 'build')
class StaticLib(Command):
description = 'build static lib'
user_options = [] # do not remove, needs to be stubbed out!
python_info = get_paths()
def initialize_options(self):
pass
def finalize_options(self):
pass
def run(self):
# Create compiler with default options
c = new_compiler()
# Optionally add include directories etc.
for d in include_dirs:
c.add_include_dir(d)
c.add_include_dir(self.python_info['include'])
# Compile into .o files
objects = c.compile(sources)
# Create static or shared library
c.create_static_lib(objects, project_name, output_dir=build_dir)
资料来源:https://gist.github.com/udnaan/d549950a33fd82d13f9e6ba4aae82964