7

I am trying to follow this tutorial to be abe to use C code in python. http://dfm.io/posts/python-c-extensions/

here is the gist https://gist.github.com/GreenJoey/b08528d6abe62da70f28f73c39c0efd0

when I try to compile it using python setup.py build_ext --inplace it fails with this error message:

running build_ext
No module named 'numpy.distutils._msvccompiler' in numpy.distutils; trying from distutils
building '_chi2' extension
creating build\temp.win-amd64-3.6
creating build\temp.win-amd64-3.6\Release
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\x86_amd64\cl.exe /c /nologo /Ox /W3 /GL /DNDEBUG /MD -IC:\Users\XXX\AppData\Local\Continuum\anaconda3\lib\site-packages\numpy\core\include -IC:\Users\XXX\AppData\Local\Continuum\anaconda3\include -IC:\Users\XXX\AppData\Local\Continuum\anaconda3\include -I"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE" -I"C:\Program Files (x86)\Windows Kits\10\include\10.0.10240.0\ucrt" -I"C:\Program Files (x86)\Windows Kits\8.1\include\shared" -I"C:\Program Files (x86)\Windows Kits\8.1\include\um" -I"C:\Program Files (x86)\Windows Kits\8.1\include\winrt" /Tc_chi2.c /Fobuild\temp.win-amd64-3.6\Release\_chi2.obj
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\x86_amd64\cl.exe /c /nologo /Ox /W3 /GL /DNDEBUG /MD -IC:\Users\XXX\AppData\Local\Continuum\anaconda3\lib\site-packages\numpy\core\include -IC:\Users\XXX\AppData\Local\Continuum\anaconda3\include -IC:\Users\XXX\AppData\Local\Continuum\anaconda3\include -I"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE" -I"C:\Program Files (x86)\Windows Kits\10\include\10.0.10240.0\ucrt" -I"C:\Program Files (x86)\Windows Kits\8.1\include\shared" -I"C:\Program Files (x86)\Windows Kits\8.1\include\um" -I"C:\Program Files (x86)\Windows Kits\8.1\include\winrt" /Tcchi2.c /Fobuild\temp.win-amd64-3.6\Release\chi2.obj
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\x86_amd64\link.exe /nologo /INCREMENTAL:NO /LTCG /DLL /MANIFEST:EMBED,ID=2 /MANIFESTUAC:NO /LIBPATH:C:\Users\XXX\AppData\Local\Continuum\anaconda3\libs /LIBPATH:C:\Users\XXX\AppData\Local\Continuum\anaconda3\PCbuild\amd64 /LIBPATH:"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\LIB\amd64" /LIBPATH:"C:\Program Files (x86)\Windows Kits\10\lib\10.0.10240.0\ucrt\x64" /LIBPATH:"C:\Program Files (x86)\Windows Kits\8.1\lib\winv6.3\um\x64" /EXPORT:PyInit__chi2 build\temp.win-amd64-3.6\Release\_chi2.obj build\temp.win-amd64-3.6\Release\chi2.obj /OUT:C:\workspace\c\b08528d6abe62da70f28f73c39c0efd0-a1d1f0469637e3a3578ab5f8ee0e641a8e31d572\_chi2.cp36-win_amd64.pyd /IMPLIB:build\temp.win-amd64-3.6\Release\_chi2.cp36-win_amd64.lib
LINK : error LNK2001: unresolved external symbol PyInit__chi2
build\temp.win-amd64-3.6\Release\_chi2.cp36-win_amd64.lib : fatal error LNK1120: 1 unresolved externals
error: Command "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\x86_amd64\link.exe /nologo /INCREMENTAL:NO /LTCG /DLL /MANIFEST:EMBED,ID=2 /MANIFESTUAC:NO /LIBPATH:C:\Users\XXX\AppData\Local\Continuum\anaconda3\libs /LIBPATH:C:\Users\XXX\AppData\Local\Continuum\anaconda3\PCbuild\amd64 /LIBPATH:"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\LIB\amd64" /LIBPATH:"C:\Program Files (x86)\Windows Kits\10\lib\10.0.10240.0\ucrt\x64" /LIBPATH:"C:\Program Files (x86)\Windows Kits\8.1\lib\winv6.3\um\x64" /EXPORT:PyInit__chi2 build\temp.win-amd64-3.6\Release\_chi2.obj build\temp.win-amd64-3.6\Release\chi2.obj /OUT:C:\workspace\c\b08528d6abe62da70f28f73c39c0efd0-a1d1f0469637e3a3578ab5f8ee0e641a8e31d572\_chi2.cp36-win_amd64.pyd /IMPLIB:build\temp.win-amd64-3.6\Release\_chi2.cp36-win_amd64.lib" failed with exit status 1120

looks like it cannot find unresolved external symbol PyInit__chi2 but the method is defined. see https://gist.github.com/GreenJoey/b08528d6abe62da70f28f73c39c0efd0#file-_chi2-c-L33

I understand that it is a linking error, but I only import "Python.h" once so I do not understand why it cannot find the method.

HennyKo
  • 712
  • 1
  • 8
  • 19
  • Possible duplicate of [What is an undefined reference/unresolved external symbol error and how do I fix it?](https://stackoverflow.com/questions/12573816/what-is-an-undefined-reference-unresolved-external-symbol-error-and-how-do-i-fix) – Ken White Mar 15 '18 at 12:50

2 Answers2

4

In my case this error was due to a mismatch between the module name I provided in setup.py and the module name used in the PYBIND11_MODULE() macro in my cpp bindings file (first argument to the macro).

Wacov
  • 400
  • 2
  • 9
2

I found the soultion here https://gist.github.com/douglas-larocca/099bf7460d853abb7c17

PyInit has to be marked with PyMODINIT_FUNC

PyMODINIT_FUNC PyInit__chi2(void)
{

    PyObject *module;
    static struct PyModuleDef moduledef = {
        PyModuleDef_HEAD_INIT,
        "_chi2",
        module_docstring,
        -1,
        module_methods,
        NULL,
        NULL,
        NULL,
        NULL
    };
    module = PyModule_Create(&moduledef);
    if (!module) return NULL;

    /* Load `numpy` functionality. */
    import_array();

    return module;
}
HennyKo
  • 712
  • 1
  • 8
  • 19