Maison  >  Article  >  Fonction de bibliothèque C++ compilée introuvable

Fonction de bibliothèque C++ compilée introuvable

WBOY
WBOYavant
2024-02-08 23:57:19900parcourir

Lorsque l'éditeur php Youzi écrit un programme C++, il peut parfois rencontrer le problème de "impossible de trouver la fonction de bibliothèque C++ compilée". Cette erreur se produit généralement pendant la phase de liaison et signifie que le compilateur ne trouve pas la fonction de bibliothèque requise. Ce problème peut avoir plusieurs raisons, telles qu'une configuration incorrecte du chemin du fichier de bibliothèque, une mauvaise installation du fichier de bibliothèque, etc. Afin de résoudre ce problème, nous pouvons le résoudre en vérifiant le chemin du fichier de bibliothèque, en réinstallant le fichier de bibliothèque et en mettant à jour le compilateur. Dans cet article, nous détaillerons comment corriger cette erreur de compilation courante.

Contenu de la question

J'ai un fichier nommé libmylibrary.a et un fichier d'en-tête nommé mylibrary.h qui contient une fonction nommée myfunction(). Je les ai combinés avec le fichier cpp (helloworldjni.cpp) et créé une nouvelle bibliothèque appelée native.dll. Cependant, lorsque j'essaie de compiler native.dll en Java à l'aide de jni, je ne trouve pas les fonctions dans libmylibrary.a et mylibrary.h.

malibrary.h

// mylibrary.h
#ifndef mylibrary_h
#define mylibrary_h

#ifdef __cplusplus
extern "c" {
#endif

void myfunction();  // declare the function prototype

#ifdef __cplusplus
}
#endif

#endif // mylibrary_h

Voici les étapes que j'ai suivies

1. Créez un fichier java (helloworldjni.java) pour intégrer jni

public class helloworldjni {
    static {
        system.load("/home/centos/test5/native.dll");
    }
    public static void main(string[] args) {
        new helloworldjni().sayhello();
    }
  //native method with no body
  public native void sayhello();
}

2. Utilisez cette commande pour créer le fichier helloworldjni.h

javac -h .  helloworldjni.java

3. Intégrez le fichier mylibrary.h et le fichier helloworldjni.h avec mon fichier cpp (helloworldjni.cpp)

#include<iostream>
#include<jni.h>
#include "mylibrary.h"
#include "helloworldjni.h"
void sayhello(){
  myfunction();
}
int main() {
    sayhello();  // call the function from the library

    return 0;
}
jniexport void jnicall java_helloworldjni_sayhello
  (jnienv* env, jobject thisobject) {
    sayhello();
}

4. Compilez ces fichiers (créez des fichiers .o)

g++ helloworldjni.cpp -l. -lmylibrary -i"/home/centos/jdk-21.0.1/include" -i"/home/centos/jdk-21.0.1/include/linux" -o helloworldjni.o

5. Générez un fichier .o en fichier .dll

g++ -shared -o native.dll helloworldjni.o

6. Compilez et exécutez helloworldjni.java

java helloworldjni

J'ai reçu cette erreur :

java: symbol lookup error: /home/centos/test5/native.dll: undefined symbol: myFunction

Comment puis-je incorporer libmylibrary.a dans ma compilation de code Java pour m'assurer qu'il reconnaît les fonctions de libmylibrary.a ?

ps : je suis sûr qu'il n'y a pas de problème avec libmylibrary.a car je peux appeler myfunction() en utilisant du C++ pur mais il semble y avoir une sorte de problème de liaison lors de l'utilisation de jni que je n'arrive pas à comprendre

Solution de contournement

J'ai essayé toutes vos étapes et apporté quelques légères modifications et cela a fonctionné pour moi. Script de build supplémentaire :

#!/bin/sh

JAVA_SDK_HOME=/home/user/lib/jdk-21.0.1

#echo BUILD THE LIB
#g++ -c mylibrary.cpp -o mylibrary.o
#ar rcs libmylibrary.a mylibrary.o

echo MAKE JAVA STUB
$JAVA_SDK_HOME/bin/javac -h . HelloWorldJNI.java

echo BUILD SO file
g++ -c -fPIC -o HelloWorldJNI.o HelloWorldJNI.cpp \
  -I $JAVA_SDK_HOME/include/ \
  -I $JAVA_SDK_HOME/include/linux

g++ -shared -o native.dll HelloWorldJNI.o -L. -lmylibrary

echo TESTING
$JAVA_SDK_HOME/bin/java HelloWorldJNI


Mais il y a quelques mises en garde :

  1. Sous Windows, vous devrez probablement configurer quelques macros, donc jniexport 实际上是 __declspec(dllexport),而不是 __declspec(dllimport)
  2. Pour créer un lien sous Linux *.so 文件,您需要使用 -fpic compiler des fichiers C++

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer