[Numpy-discussion] npy_log2 undefined on Linux

Matthew Brett matthew.brett at gmail.com
Sat Oct 25 17:15:05 EDT 2014


On Fri, Oct 24, 2014 at 6:04 PM, Matthew Brett <matthew.brett at gmail.com> wrote:
> Hi,
>
> We (dipy developers) have a hit a new problem trying to use the
> ``npy_log`` C function in our code.
>
> Specifically, on Linux, but not on Mac or Windows, we are getting
> errors of form:
>
> ImportError: /path/to/extension/distances.cpython-34m.so: undefined
> symbol: npy_log2
>
> when compiling something like:
>
> <eg_log.pyx>
> import numpy as np
> cimport numpy as cnp
>
> cdef extern from "numpy/npy_math.h" nogil:
>     double npy_log(double x)
>
>
> def use_log(double val):
>     return npy_log(val)
> </eg_log.pyx>
>
> See : https://github.com/matthew-brett/mincy/tree/npy_log_example for
> a self-contained example that replicates the failure with ``make``.
>
> I guess this means that the code referred to by ``npy_log`` is not on
> the ordinary runtime path on Linux?

To answer my own question - npy_log is defined in ``libnpymath.a``, in
<numpy>/core/lib.

The hint I needed was in
https://github.com/numpy/numpy/blob/master/doc/source/reference/c-api.coremath.rst

The correct setup.py is:

<setup.py>
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext

from numpy.distutils.misc_util import get_info
npm_info = get_info('npymath')

ext_modules = [Extension("eg_log", ["eg_log.pyx"],
                         **npm_info)]

setup(
  name = 'eg_log',
  cmdclass = {'build_ext': build_ext},
  ext_modules = ext_modules
)
</setup.py>

Cheers,

Matthew



More information about the NumPy-Discussion mailing list