构建含C++扩展的Conda包时无法找到fftw3.h头文件求助
适配FFTW依赖的Conda包配置示例
项目目录结构
your-package/ ├── meta.yaml ├── build.sh ├── setup.py ├── cythonwrap.pyx └── lib/ ├── function.cpp └── function.h
meta.yaml 完整配方
package: name: your-package-name version: 0.1.0 source: path: . build: number: 0 script: bash build.sh skip: false # 按需调整,比如Windows平台可设为true requirements: build: - python {{ python }} - cython >=0.29 - fftw >=3.3 - {{ compiler('c') }} - {{ compiler('cxx') }} run: - python - fftw >=3.3 about: home: https://your-project-url.com license: MIT summary: 你的包功能描述
build.sh 编译脚本
#!/bin/bash # 注入Conda环境的头文件和库路径 export CFLAGS="-I${PREFIX}/include ${CFLAGS}" export CXXFLAGS="-I${PREFIX}/include ${CXXFLAGS}" export LDFLAGS="-L${PREFIX}/lib -lfftw3 ${LDFLAGS}" # 编译Cython扩展并安装到环境 python setup.py build_ext --inplace python setup.py install --prefix=${PREFIX}
setup.py 核心配置
from setuptools import setup, Extension from Cython.Build import cythonize import os # 获取Conda环境前缀路径 prefix = os.environ.get('PREFIX', '') extensions = [ Extension( "cythonwrap", sources=["cythonwrap.pyx", "lib/function.cpp"], include_dirs=[os.path.join(prefix, 'include')], library_dirs=[os.path.join(prefix, 'lib')], libraries=['fftw3'], language='c++' ) ] setup( name="your-package-name", version="0.1.0", ext_modules=cythonize(extensions), )
关键注意事项
- 必须在
requirements/build中声明fftw:构建阶段需要直接读取它的头文件和库文件,仅在run里声明会导致构建时依赖缺失。 - 全程使用
${PREFIX}(shell脚本)或{{ PREFIX }}(meta.yaml Jinja2变量):Conda会自动替换为当前环境路径,避免硬编码引发的跨环境/跨平台问题。 - 引入官方编译器占位符:
{{ compiler('c') }}和{{ compiler('cxx') }}会自动适配不同平台的编译工具链(如Linux的gcc、macOS的clang)。
内容的提问来源于stack exchange,提问作者Riccardo Buscicchio
相关产品推荐
相关产品推荐

