"Cython" -Tutorial, das Python explosiv macht: Wenn C ++ - Code von der Bibliothek abhängt. Zuallererst CMake.

Überblick

Ich möchte in C ++ geschriebenen Code zu einer Bibliothek machen, die in Python aufgerufen werden kann. Es gab jedoch eine große Mauer namens Cython.

Dies ist das "Cython" -Tutorial, das Python explosiv macht: Wenn der C ++ - Code von der Bibliothek abhängt. Dies ist die Fortsetzung des Vorbereitungsabschnitts.

Der Code ist unter "github hier" aufgeführt. Schauen Sie also bitte vorbei.

Als minimale Ordnerstruktur war es so.

Situationserklärung

(myenv) user@~/Documents/cython_practice[master]> tree .
.
├── README.md
├── cpp_library
│   ├── TestClass1.cpp
│   └── TestClass1.h
├── cython
│   ├── my_library.pxd
│   ├── my_library.pyx
│   ├── test_class1.pxd
│   └── test_class1.pyx
└── setup.py

Darüber hinaus am Ende des letzten Males

wget https://gmplib.org/download/gmp/gmp-6.1.2.tar.xz &&\
tar xvf gmp-6.1.2.tar.xz &&\
cd gmp-6.1.2 &&\
./configure --prefix=/usr/local/gmp/6_1_2 &&\
make && make check && make install

Ich habe die `` `gmp``` Bibliothek installiert.

Was ist diesmal zu tun?

Diesmal zuerst

  1. Schreiben Sie einfachen Code mit der gmp-Bibliothek und stellen Sie sicher, dass er mit Befehlen kompiliert werden kann.
  2. Wie werden die C ++ - Bibliotheken überhaupt installiert und referenziert?
  3. Wie erfolgt die Kompilierung abhängiger Programme mit CMake?
  4. Wie wird es in setup.py geschrieben, wenn es in cython konvertiert wird?

Ich werde bis zu 3 erklären. In Bezug auf 4 werde ich Cython tatsächlich verwenden, um ein C ++ - Programm mit Abhängigkeiten zu kompilieren, damit es von Python aus aufgerufen werden kann, was ich im nächsten Artikel schreiben werde.

C ++ - Abhängigkeiten

Wie werden die C ++ - Bibliotheken überhaupt installiert und referenziert?

gmpDies ist der Befehl, wenn die Bibliothek installiert ist.

./configure --prefix=/usr/local/gmp/6_1_2



 Hier wird die Objektdatei gespeichert, die beim späteren Kompilieren mit `` `make`` `erstellt wurde, und die Header-Datei, die zum Zeitpunkt von` `make install`` `die Quelle des Projekts ist. Ist der angegebene Befehl.

 Wenn nicht angegeben, wird die Objektdatei im Wesentlichen in `` `/ usr / local / lib`` `und die erforderliche Header-Datei (im Grunde eine Header-Datei, die alle für die Bibliothek erforderlichen Programmdateien enthält) gespeichert. ) Wird in `` `/ usr / local / include`` `gespeichert.

 Danach wird es von `` `make`` `kompiliert und die von` `` make install` `` kompilierte Objektdatei und Header-Datei werden gespeichert.

 Stellen Sie hier sicher, dass die Objektdatei und die Header-Datei der gmp-Bibliothek tatsächlich im angegebenen Ordner gespeichert sind.

```bash
root@e96f489c2395:/# ls /usr/local/gmp/6_1_2/lib/
libgmp.a  libgmp.la  libgmp.so  libgmp.so.10  libgmp.so.10.3.2
root@e96f489c2395:/# ls /usr/local/gmp/6_1_2/include/
gmp.h

Sicherlich befindet sich die Objektdatei unter `/ usr / local / gmp / 6_1_2 / lib```, Die Header-Datei wird unter `/ usr / local / gmp / 6_1_2 / include``` gespeichert.

cmake

Wie erfolgt die Kompilierung abhängiger Programme mit CMake?

Um ein Programm zu erstellen und zu kompilieren, das sie verwendet, müssen Sie daher mit Bezug auf sie kompilieren. Verwenden Sie zunächst einfach g ++, um ein einfaches Programm zu schreiben und es zu kompilieren.

test.cpp


#include <iostream>
#include <gmp.h>

using namespace std;

void print_test(){
    mpz_t test;
    mpz_init(test);
    mpz_set_ui(test, 1);
    gmp_printf("print : %Zd \n", test);
}

int main(){
    print_test();
}


Sie müssen nichts über die gmp-Bibliothek wissen, aber da gmp eine Bibliothek ist, die große Ganzzahlen berechnet, weist dieses Programm einem Objekt namens test einfach 1 zu und druckt es aus.

Kompilieren Sie die Bibliothek explizit mit Optionen. Wenn Sie versuchen zu kompilieren, ohne etwas über die Bibliothek zu schreiben, wird natürlich ein Referenzfehler angezeigt.

root@e96f489c2395:/from_local# g++ test.cpp
/tmp/ccZnVmvP.o: In function `main':
test.cpp:(.text+0x1f): undefined reference to `__gmpz_init'
test.cpp:(.text+0x30): undefined reference to `__gmpz_set_ui'
test.cpp:(.text+0x48): undefined reference to `__gmp_printf'
collect2: error: ld returned 1 exit status

Es wird sein. Dies liegt natürlich daran, dass die abhängigen Bibliotheken nicht angegeben werden, sondern durch Lösen,

root@e96f489c2395:/from_local# g++ test.cpp -L/usr/local/gmp/6_1_2/lib -I/usr/local/gmp/6_1_2/include -lgmp
root@e96f489c2395:/from_local# ./a.out
print : 1 

Natürlich können Sie so kompilieren. In diesem Fall gibt `` `-Lden Pfad zur Bibliothek (Objektdatei) an.-i```Ist eine Kompilierungsoption, die den Pfad zur Header-Datei angibt.

Wenn Sie jedoch mehrere abhängige Bibliotheken haben oder wenn Sie mehrere Programme haben, die Sie schreiben, kann das Kompilieren mit `g ++` wie diesem ziemlich ärgerlich sein. Bereiten Sie daher CMakeLists.txt vor und kompilieren Sie es einfach.

Erstellen Sie dazu die folgenden `CMakelists.txt `

cmake . &&Es ist vorzuziehen, mit make zu kompilieren.



 Anstatt hier `` `CMakelists.txt`` `wie folgt zu erstellen und mit dem Befehl` `` g ++ `` `und Optionen zu kompilieren,` `` cmake. && make``` Ich werde versuchen, damit zu kompilieren.


#### **`CMakeLists.txt`**
```txt

cmake_minimum_required(VERSION 3.10)

project(TEST VERSION 1.1.0 LANGUAGES CXX)

# Executable will be in ../bin
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR})
set(CMAKE_CXX_FLAGS "-g -O0 -lgmp")


add_executable(test1 
    test.cpp
    )

target_sources(test1
    PRIVATE
)

target_include_directories(test1 PRIVATE /usr/local/gmp/6_1_2/include/)
target_link_libraries(test1 gmp /usr/local/gmp/6_1_2/lib)

root@e96f489c2395:/from_local# cmake .
-- Configuring done
WARNING: Target "test1" requests linking to directory "/usr/local/gmp/6_1_2/lib".  Targets may link only to libraries.  CMake is dropping the item.
-- Generating done
-- Build files have been written to: /from_local
root@e96f489c2395:/from_local# make 
[100%] Built target test1
root@e96f489c2395:/from_local# ./test1
print : 1 

Zusammenfassung

Als Wissen, das beim Konvertieren eines C ++ - Programms in Cython erforderlich ist, wurde Folgendes durchgeführt, um die Cythonisierung eines Programms zu erreichen, das von der C ++ - Seite abhängig ist.

Im nächsten Artikel

Diesmal hier.

Ende.

Recommended Posts

"Cython" -Tutorial, das Python explosiv macht: Wenn C ++ - Code von der Bibliothek abhängt. Zuallererst CMake.
"Cython" -Tutorial, das Python explosiv macht: Wenn C ++ - Code von der Bibliothek abhängt. Vorbereitung
"Cython" -Tutorial, das Python explosiv macht: Wenn C ++ - Code von der Bibliothek abhängt. Schreiben Sie setup.py.
"Cython" -Tutorial, um Python explosiv zu machen: Übergeben Sie das C ++ - Klassenobjekt an das Klassenobjekt auf der Python-Seite. Teil 2
"Cython" -Tutorial, das Python explosiv macht: Handhabung, wenn Funktionen auf der C ++ - Seite als Referenz übergeben werden.
"Cython" Tutorial, um Python explosiv zu machen: Grundkonfiguration
"Cython" -Tutorial, um Python explosiv zu machen: So analysieren Sie die in C ++ - Code definierte Enum-Klasse mit Enum in Python.
Erste Python ② Versuchen Sie, Code zu schreiben, während Sie die Funktionen von Python untersuchen
Verwendung der C-Bibliothek in Python
Bei der Konvertierung von CSV in JSON mit Python bin ich auf einen Zeichencode gestoßen
Ich möchte C ++ - Code aus Python-Code erstellen!
Machen Sie mit Python einen Haltepunkt auf der c-Ebene
Einfache Erstellung von C ++ - Code mit CMake auf Docker
Ich hatte das Gefühl, dass ich den Python-Code nach C ++ 98 portiert habe.
[Einführung in Python] Grundlegende Verwendung der Bibliothek matplotlib
GPU-fähiger Build der LibTorch-App (PyTorch C ++) unter Windows ohne CMake (nur beim ersten Mal)
Erleichtern Sie die Anzeige von Python-Modulausnahmen
Die erste API, die mit dem Python Djnago REST-Framework erstellt wurde
Einstellungen zum Eingeben und Debuggen des Inhalts der Bibliothek mit VS-Code
Übergeben Sie die OpenCV-Daten der ursprünglichen C ++ - Bibliothek an Python
Durch die Installation des Pip-Pakets, das beim Erstellen von opencv aus dem Quellcode von opencv-python abhängt
Wenn Sie mehrere Versionen derselben Python-Bibliothek verwenden möchten (virtuelle Umgebung mit venv)
Wrap (Teil der) AtCoder Library in Cython zur Verwendung in Python
Unterschiede, die C # -Ingenieure beim ersten Erlernen von Python verspürten
Messen Sie die Testabdeckung von Push-Python-Code auf GitHub.
[Einführung in Python] Ich habe die Namenskonventionen von C # und Python verglichen.
[Python] So erhalten Sie den ersten und den letzten Tag des Monats
Ich habe den Code geschrieben, um den Brainf * ck-Code in Python zu schreiben
So aktualisieren Sie die Python-Version von Cloud Shell in GCP
So führen Sie den Übungscode des Buches "Profitable KI mit Python erstellen" in Google Colaboratory aus
Erster Python 3 ~ Der Beginn der Wiederholung ~
Python Hinweis: Wenn Sie die Attribute eines Objekts kennen möchten
Ich habe versucht, den Authentifizierungscode der Qiita-API mit Python abzurufen.
Laden Sie gemeinsam die Bilder herunter, die in den Text der Pull-Anfrage auf Github eingefügt wurden
Ich habe versucht, die Beschleunigung von Python durch Cython zu verifizieren und zu analysieren
Von der Re-Environment-Konstruktion von Python bis zur grafischen Zeichnung (auf Visual Studio-Code)
Python-Code zur Bestimmung der monatlichen Signale für Investitionen mit relativer Stärke
[Python3] Code, der verwendet werden kann, wenn Sie die Erweiterung eines Bildes sofort ändern möchten
Umgang mit "^ [[A ^ [[B ^ [[C ^ [[D"]] beim Drücken der Richtungstaste beim Ausführen von Python auf dem Mac