Organiser les builds dans des combinaisons C ++ / Java et Win / Linux

introduction

Dans cet article, j'organiserai les connaissances autour de la construction de deux langages de programmation, C ++ et Java. Plus précisément, nous organiserons la «méthode de construction de base», «l'utilisation de la bibliothèque partagée» et «l'outil de construction» dans chaque langue. À ce moment-là, s'il y a une différence entre Windows et Linux, ce point sera également mentionné.

Le but de la publication de cet article est d'organiser les connaissances par l'affiche lui-même, et le contenu peut contenir des erreurs. Si vous trouvez des erreurs, veuillez les signaler dans les commentaires.

Méthode de construction de base

Cette section résume les méthodes de base de construction à partir de la ligne de commande. Décrit comme "build = compile + link".

C++ Supposons que votre projet se compose de trois fichiers: main.cpp, hoge.cpp et hoge.h. Compiler

g++ -c main.cpp hoge.cpp

Le lien est

g++ main.o hoge.o

Cela peut être fait avec la commande, et un fichier exécutable (a.out sous Linux, a.exe sous Windows) est généré. -c est une option "compiler uniquement", et si vous omettez cette option, vous pouvez même générer un fichier exécutable à la fois.

g++ main.cpp hoge.cpp

Java Supposons que votre projet se compose de deux fichiers, Main.java et Hoge.java. Compiler

javac Main.java

Vous pouvez le faire avec la commande, et les fichiers Main.class et Hoge.class seront générés. Les dépendances sont résolues automatiquement, vous n'avez donc pas besoin d'ajouter Hoge.java comme argument. De plus, étant donné que le lien est effectué au moment de l'exécution, il n'est pas nécessaire d'établir un lien explicite avec la commande. Exécution

java Main

C'est fait avec la commande.

Comment utiliser la bibliothèque partagée

Nous expliquerons comment utiliser la bibliothèque partagée en utilisant OpenCV comme exemple. La raison d'utiliser OpenCV comme exemple est qu'il s'agit d'une bibliothèque familière aux affiches, donc si vous n'êtes pas familier avec OpenCV, veuillez la remplacer par une autre bibliothèque et la lire.

C++(Linux) Spécifiez le chemin d'inclusion, le chemin de bibliothèque et le fichier de bibliothèque partagé avec les options g ++. Par exemple, si le chemin d'inclusion: / usr / local / include / opencv4, le chemin de bibliothèque: / usr / local / lib et le fichier de bibliothèque partagée: libopencv_core.so, procédez comme suit.

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

C++(Windows) Pour Windows, spécifiez la bibliothèque d'importation (fichier .lib) avec l'option -l. Si le nom du fichier de bibliothèque d'importation est opencv_world420.lib, générez-le avec la commande suivante.

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

Au moment de l'exécution, vous devez transmettre le chemin d'accès au fichier .dll (bibliothèque partagée elle-même) qui est associé au fichier .lib. Pour la relation entre les fichiers .lib et les fichiers .dll, les sites suivants peuvent être utiles. http://exlight.net/devel/windows/dll/windll.html

Java(Linux) En Java, le fichier jar joue un rôle similaire à celui de la bibliothèque d'importation ci-dessus, spécifiez donc le fichier jar dans le chemin de classe et construisez comme indiqué ci-dessous.

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

Ensuite, au moment de l'exécution, vous devez donner le chemin d'accès au fichier .so, qui est le corps principal de la bibliothèque partagée, sous la forme java.library.path. (Je vais omettre l'explication, mais vous devez charger le fichier .so avec la fonction System.loadLibrary également sur le code source) De plus, le chemin de classe est requis au moment de l'exécution et le chemin (.) Du fichier de classe que vous souhaitez exécuter doit également être spécifié.

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

Pour plus de détails, veuillez vous référer à la page suivante. https://stackoverflow.com/questions/28727766/how-to-add-an-external-library-opencv-jar-file-to-the-java-build-path-from-th

Java(Windows) Pour Windows, chargez le fichier .dll au lieu du fichier .so et le délimiteur de chemin de classe sera ";" au lieu de ":".

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

Outil de création

Cette section présente CMake, un outil de construction en langage C, et Gradle, un outil de construction Java.

CMake Avant d'expliquer CMake, parlons de make. make est un pionnier des outils de build, et vous pouvez automatiser les builds en écrivant des règles de build dans votre Makefile.

CMake est souvent utilisé dans la procédure de CMake → make → make install lors de l'installation du code source du langage C. Dans chacune de ces étapes, les tâches suivantes sont effectuées.

Dans l'exemple utilisant OpenCV, CMakeLists.txt a le contenu suivant. (Lorsque vous n'utilisez pas pkg_config)

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 Quant à Gradle, je ne mettrai que le contenu de build.gradle comme mon propre mémo.

apply plugin: 'java'

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

en conclusion

Dans cet article, j'ai organisé les connaissances autour de la construction de deux langages de programmation, C ++ et Java. À l'origine, j'allais aborder le processus de construction qui est caché dans l'EDI, mais je ne suis pas sûr que ce soit plus nécessaire, alors j'aimerais terminer ici. En conséquence, le contenu est similaire à l'article d'il y a 20 ans, mais j'apprécierais que vous y fassiez référence.

Recommended Posts

Organiser les builds dans des combinaisons C ++ / Java et Win / Linux
La direction de Java dans "C ++ Design and Evolution"
De Java à C et de C à Java dans Android Studio
Différences dans l'écriture des classes Java, C # et Javascript
Implémenter une combinaison de mathématiques en Java
Reproduire l'énumération Java en C #
Histoire de remplacement C # et Java
Résolution avec Ruby, Perl et Java AtCoder ABC 113 C Reference
Lire le fichier de propriétés Java en C #
Essayez de mélanger le langage C et Swift dans un seul projet (OS X, Linux)
Exemple d'encodage et de décodage en Java
Java, JavaScript, C # (différence d'affectation)
CGI en C et Dart: Introduction (1)
AtCoder ARC 081 C hash à résoudre en Ruby, Perl et Java
Classe StringBuffer et StringBuilder en Java
Comprendre equals et hashCode en Java
Crypter avec Java et décrypter avec C #
Bonjour tout le monde en Java et Gradle
Essayez de mélanger plus de langage C et Swift dans un seul projet (OS X, Linux)
Tri par hachage AtCoder ABC 111 C résolu en Ruby, Perl et Java
Différence entre final et immuable en Java
Lier le code Java et C ++ avec SWIG
Différence entre les listes d'arry et les listes liées en Java
Programmer les en-têtes et pieds de page PDF en Java
Apprenez les modèles Flyweight et ConcurrentHashMap en Java
Lire et écrire des fichiers gzip en Java
Différence entre int et Integer en Java
Discrimination d'énum dans Java 7 et supérieur
Analyser en Java les chaînes de date et d'heure formatées par la fonction asctime du langage C
Organisez la différence de confort d'écriture entre l'expression lambda Java et l'expression lambda Kotlin.
Concernant les modificateurs transitoires et la sérialisation en Java
Détecter des vidéos similaires dans Java et OpenCV rev.2
Différence entre next () et nextLine () dans Java Scanner
Essayez d'utiliser Sourcetrail (version win) avec du code Java
Capture et sauvegarde de l'installation de sélénium en Java
Détecter des vidéos similaires dans Java et OpenCV rev.3
Ajouter, lire et supprimer des commentaires Excel à l'aide de Java
Vérifier le comportement statique et public dans les méthodes Java
[Java] Comprenez en 10 minutes! Tableau associatif et HashMap
Résumer les différences entre l'écriture C # et Java
Distinguer les nombres positifs et négatifs en Java
Java ajoute et supprime les filigranes dans les documents Word
Détecter des vidéos similaires dans Java et OpenCV rev.1
Représente le «jour suivant» et le «jour précédent» en Java / Android
Questions sur la gestion des exceptions Java throw et try-catch
Télécharger et télécharger des notes en java sur S3
Crypter / décrypter avec AES256 en PHP et Java
Générer OffsetDateTime à partir de Clock et LocalDateTime en Java