Python CFFI-Fehler LNK2001: unresolved external symbol PyInit__... beheben

Problem:

Beim Versuch, die Python-Bibliothek mit einem C-Modul auf Windows zu installieren, erscheint eine Fehlermeldung wie

error.txt
LINK : error LNK2001: unresolved external symbol PyInit__cv_algorithms
build\temp.win-amd64-3.6\Release\src_cv_algorithms.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' failed with exit status 1120

Lösung

Auf Windows generiert CFFI diese nicht ordnungsgemäß.

Dies kann einfach behoben werden, indem eine Template-Funktion hinzugefügt und diese nur auf Windows eingebunden wird: Ich empfehle, windows.cpp wie folgt zu erstellen:

windows.cpp
/**
 * This contains hacks to get the installation on Windows working.
 * This fixes error LNK2001: unresolved external symbol PyInit__cv_algorithms
 */
void PyInit__cv_algorithms(void) { }

Den Namen der Funktion aus der Fehlermeldung kopieren und einfügen! Der Fix funktioniert nicht, wenn der falsche Funktionsname verwendet wird.

Beispiel, wie diese Datei nur auf Windows eingebunden wird:

setup.py
platform_src = ["src/windows.cpp"] if os.name == 'nt' else []

mod_cv_algorithms = Extension('cv_algorithms._cv_algorithms',
                         sources=['src/main.cpp'] + platform_src)

Ein vollständiges Beispiel findet sich unter cv_algorithms, wo ich diesen Fix zuerst implementiert habe.


Check out similar posts by category: Python