Organisieren Sie Builds in C ++ / Java- und Win / Linux-Kombinationen

Einführung

In diesem Artikel werde ich das Wissen über das Erstellen von zwei Programmiersprachen, C ++ und Java, organisieren. Insbesondere werden wir die "grundlegende Erstellungsmethode", die "Verwendung der gemeinsam genutzten Bibliothek" und das "Erstellungswerkzeug" in jeder Sprache organisieren. Wenn zu diesem Zeitpunkt ein Unterschied zwischen Windows und Linux besteht, wird dieser Punkt ebenfalls erwähnt.

Der Zweck der Veröffentlichung dieses Artikels besteht darin, das Wissen durch das Poster selbst zu organisieren. Der Inhalt kann Fehler enthalten. Wenn Sie Fehler finden, weisen Sie diese bitte in den Kommentaren darauf hin.

Grundlegende Erstellungsmethode

In diesem Abschnitt werden die grundlegenden Methoden zum Erstellen über die Befehlszeile zusammengefasst. Beschrieben als "build = compile + link".

C++ Angenommen, Ihr Projekt besteht aus drei Dateien: main.cpp, hoge.cpp und hoge.h. Kompilieren

g++ -c main.cpp hoge.cpp

Der Link ist

g++ main.o hoge.o

Dies kann mit dem Befehl erfolgen, und eine ausführbare Datei (a.out unter Linux, a.exe unter Windows) wird generiert. -c ist eine Option "Nur kompilieren". Wenn Sie diese Option weglassen, können Sie sogar sofort eine ausführbare Datei generieren.

g++ main.cpp hoge.cpp

Java Angenommen, Ihr Projekt besteht aus zwei Dateien, Main.java und Hoge.java. Kompilieren

javac Main.java

Sie können dies mit dem Befehl tun, der die Dateien Main.class und Hoge.class generiert. Abhängigkeiten werden automatisch aufgelöst, sodass Sie Hoge.java nicht als Argument hinzufügen müssen. Da die Verknüpfung zur Laufzeit erfolgt, muss keine explizite Verknüpfung mit dem Befehl hergestellt werden. Ausführung

java Main

Dies geschieht mit dem Befehl.

Verwendung der gemeinsam genutzten Bibliothek

Wir werden erklären, wie die gemeinsam genutzte Bibliothek am Beispiel von OpenCV verwendet wird. Der einzige Grund für die Verwendung von OpenCV als Beispiel ist, dass es sich um eine Bibliothek handelt, die mit Postern vertraut ist. Wenn Sie also nicht mit OpenCV vertraut sind, ersetzen Sie sie bitte durch eine andere Bibliothek und lesen Sie sie.

C++(Linux) Geben Sie den Include-Pfad, den Bibliothekspfad und die gemeinsam genutzte Bibliotheksdatei mit g ++ - Optionen an. Wenn beispielsweise der Include-Pfad: / usr / local / include / opencv4, der Bibliothekspfad: / usr / local / lib und die gemeinsam genutzte Bibliotheksdatei: libopencv_core.so wie folgt lauten.

g++ main.cpp -I/usr/local/include/opencv4 -L/usr/local/lib -lopencv_core

C++(Windows) Geben Sie unter Windows die Importbibliothek (.lib-Datei) mit der Option -l an. Wenn der Name der Importbibliotheksdatei opencv_world420.lib lautet, erstellen Sie ihn mit dem folgenden Befehl.

g++ main.cpp -IC:/opencv/build/include -LC:/opencv/build/x64/lib -lopencv_world420

Zur Laufzeit müssen Sie den Pfad zur DLL-Datei (gemeinsam genutzte Bibliothek selbst) übergeben, die mit der LIB-Datei gekoppelt ist. Für die Beziehung zwischen LIB-Dateien und DLL-Dateien können die folgenden Websites hilfreich sein. http://exlight.net/devel/windows/dll/windll.html

Java(Linux) In Java spielt die JAR-Datei eine ähnliche Rolle wie die obige Importbibliothek. Geben Sie daher die JAR-Datei im Klassenpfad an und erstellen Sie sie wie unten gezeigt.

javac -cp /usr/local/share/java/opencv4/opencv-430.jar Main.java

Zur Laufzeit müssen Sie dann den Pfad zur .so-Datei, die den Hauptteil der gemeinsam genutzten Bibliothek darstellt, als java.library.path angeben. (Ich werde die Erklärung weglassen, aber Sie müssen die .so-Datei mit der Funktion System.loadLibrary auch auf den Quellcode laden.) Außerdem ist der Klassenpfad zum Zeitpunkt der Ausführung erforderlich, und der Pfad (.) Der Klassendatei, die Sie ausführen möchten, muss ebenfalls angegeben werden.

java -cp .:/usr/local/share/java/opencv4/opencv-430.jar -Djava.library.path=/usr/local/share/java/opencv4 Main

Einzelheiten finden Sie auf der folgenden Seite. https://stackoverflow.com/questions/28727766/how-to-add-an-external-library-opencv-jar-file-to-the-java-build-path-from-th

Java(Windows) Laden Sie unter Windows die DLL-Datei anstelle der SO-Datei, und der Klassenpfadbegrenzer lautet ";" anstelle von ":".

javac -cp C:/opencv/build/java/opencv-430.jar Main.java
java -cp .;C:/opencv/build/java/opencv-420.jar -Djava.library.path=C:/opencv/build/java/x64 Main

Werkzeug erstellen

In diesem Abschnitt werden CMake, ein Tool zum Erstellen von C-Sprachen, und Gradle, ein Java-Build-Tool, vorgestellt.

CMake Bevor wir CMake erklären, berühren wir make. make ist ein Pionier der Build-Tools. Sie können Builds automatisieren, indem Sie Build-Regeln in Ihr Makefile schreiben.

CMake wird häufig in der Prozedur CMake → make → make install verwendet, wenn der Quellcode der C-Sprache installiert wird. In jedem dieser Schritte werden die folgenden Aufgaben ausgeführt.

Im Beispiel mit OpenCV enthält CMakeLists.txt den folgenden Inhalt. (Wenn Sie pkg_config nicht verwenden)

cmake_minimum_required(VERSION 3.10)
project(Main)

add_executable(Main main.cpp)

target_include_directories(Main
    PRIVATE
    /usr/local/include/opencv4
)

target_link_libraries(Main
    PRIVATE
    /usr/local/lib/libopencv_core.so
)

Gradle Was Gradle betrifft, werde ich nur den Inhalt von build.gradle als mein eigenes Memo einfügen.

apply plugin: 'java'

dependencies {
    compile files("/usr/local/share/java/opencv4/opencv-430.jar")
}

abschließend

In diesem Artikel habe ich das Wissen über das Erstellen von zwei Programmiersprachen, C ++ und Java, organisiert. Ursprünglich wollte ich auf den in der IDE versteckten Erstellungsprozess eingehen, bin mir aber nicht sicher, ob er noch erforderlich ist, und möchte hier enden. Infolgedessen ähnelt der Inhalt dem Artikel vor 20 Jahren, aber ich würde es begrüßen, wenn Sie darauf verweisen könnten.

Recommended Posts

Organisieren Sie Builds in C ++ / Java- und Win / Linux-Kombinationen
Die Richtung von Java in "C ++ Design and Evolution"
Von Java nach C und von C nach Java in Android Studio
Unterschiede beim Schreiben von Java-, C # - und Javascript-Klassen
Implementieren Sie eine Kombination aus Mathematik in Java
Reproduzieren Sie die Java-Enumeration in C #
C # und Java überschreiben Story
Lösen mit Ruby, Perl und Java AtCoder ABC 113 C Referenz
Lesen Sie die Java-Eigenschaftendatei in C #
Versuchen Sie, C-Sprache und Swift in einem Projekt (OS X, Linux) zu mischen.
Beispiel für Codierung und Decodierung in Java
Java, JavaScript, C # (Unterschied in der Zuordnung)
CGI in C und Dart: Einführung (1)
AtCoder ARC 081 C-Hash, der in Ruby, Perl und Java gelöst werden muss
StringBuffer- und StringBuilder-Klasse in Java
Verstehe gleich und hashCode in Java
Mit Java verschlüsseln und mit C # entschlüsseln
Hallo Welt in Java und Gradle
Versuchen Sie, mehr C-Sprache und Swift in einem Projekt (OS X, Linux) zu mischen.
AtCoder ABC 111 C Hash-Sortierung In Ruby, Perl und Java gelöst
Unterschied zwischen final und Immutable in Java
Verknüpfen Sie Java- und C ++ - Code mit SWIG
Unterschied zwischen Arrylist und verknüpfter Liste in Java
Programmieren Sie PDF-Kopf- und Fußzeilen in Java
Lernen Sie Flyweight-Muster und ConcurrentHashMap in Java
Lesen und Schreiben von GZIP-Dateien in Java
Unterschied zwischen int und Integer in Java
Diskriminierung von Enum in Java 7 und höher
Analysieren Sie die Datums- und Zeitzeichenfolge, die von der asctime-Funktion der C-Sprache in Java formatiert wurde
Organisieren Sie den Unterschied im Schreibkomfort zwischen dem Java-Lambda-Ausdruck und dem Kotlin-Lambda-Ausdruck.
In Bezug auf transiente Modifikatoren und Serialisierung in Java
Erkennen Sie ähnliche Videos in Java und OpenCV Version 2
Unterschied zwischen next () und nextLine () in Java Scanner
Versuchen Sie es mit Sourcetrail (Win-Version) mit Java-Code
Erfassen und speichern Sie die Selen-Installation in Java
Erkennen Sie ähnliche Videos in Java und OpenCV Version 3
Hinzufügen, Lesen und Löschen von Excel-Kommentaren mit Java
Überprüfen Sie das statische und öffentliche Verhalten in Java-Methoden
[Java] Verstehe in 10 Minuten! Assoziatives Array und HashMap
Fassen Sie die Unterschiede zwischen C # - und Java-Schrift zusammen
Unterscheiden Sie in Java zwischen positiven und negativen Zahlen
Java fügt Wasserzeichen in Word-Dokumenten hinzu und entfernt sie
Erkennen Sie ähnliche Videos in Java und OpenCV Version 1
Repräsentiert "nächster Tag" und "vorheriger Tag" in Java / Android
Fragen in Java-Ausnahmebehandlung werfen und versuchen-fangen
Laden Sie Notizen in Java auf S3 hoch und laden Sie sie herunter
Verschlüsseln / Entschlüsseln mit AES256 in PHP und Java
Generieren Sie OffsetDateTime aus Clock und LocalDateTime in Java