在 C 代码中找不到库

Posted

技术标签:

【中文标题】在 C 代码中找不到库【英文标题】:Can not find libraries in C code 【发布时间】:2018-11-09 06:00:47 【问题描述】:

我正在尝试使用 cython 编译模块,但编译器无法在外部 c 文件中找到包含库(我以 cmath 为例,但我想要的其他库如 cstdiocstdint , cstring 也有同样的问题)

一个最小的示例由以下 4 个简单文件组成:

cfile.c:

#include <cmath>

test_pxd.pxd:

cdef extern from "cfile.c":
    pass

test.pyx:

cimport test_pxd

setup.py:

from distutils.core import Extension, setup
from Cython.Build import cythonize

sources = ['test.pyx']

extension = [Extension('test',sources)]

setup(ext_modules=cythonize(extension,force=True))

如果我运行setup.py

 python3 setup.py build_ext --inplace

我得到错误:

cfile.c:1:17: 致命错误:cmath: 没有这样的文件或目录

需要注意的是,直接编译 c 文件,例如使用g++ -c cfile.c,不需要任何额外的链接让编译器找到这些库。

如何让 cython 中的编译器在外部 c 文件中找到 cmath(以及其他,例如 cstdiocstdintcstring)库?

【问题讨论】:

如果是c,则名称为math.hcmath是c++符号 另外,使用 C 编译器,例如gcc,而不是 C++ 编译器(此处为g++)。 我尝试将标志 "language='c++' 添加到 cythonize,并将 #distutils: language=c++ 添加到每个文件的开头,但 仍然不起作用。 好吧,我还必须将扩展名更改为 .cpp,而不是 .c,现在它可以工作了 【参考方案1】:

定义应该针对头部,而不是实现:

cdef extern from "cfile.h":
    pass

如果使用 C++ 库,必须将 language='c++' 指令添加到 setuptools/cythonize。

cythonize(<..>,
          language="c++",
      )

另见docs。

【讨论】:

以上是关于在 C 代码中找不到库的主要内容,如果未能解决你的问题,请参考以下文章

c++文件中jni库找不到报红

在 C 代码中找不到库

Ubuntu 安装MySQL报共享库找不到

C++ Pascal 字符串错误。我在代码中找不到错误

在Visual Studio Designer中找不到自定义字体的C#文件

在 MSVC 2013 或 NetBeans 中找不到 setw