Compilation de l'agent JVMTI (à l'aide de GCC, sous OSX Snow Leopard)
-
07-07-2019 - |
Question
J'essaie de créer un agent JVMTI à l'aide de la commande g ++ sur Snow Leopard et j'obtiens le message d'erreur suivant:
$ g++ -o agent.so -I `/usr/libexec/java_home`/include agent.cpp
Undefined symbols: "_main", referenced from: start in crt1.10.6.o ld: symbol(s) not found collect2: ld returned 1 exit status
Je suis un novice en matière de programmation gcc et C ++, je n'ai donc aucune idée de ce que cette erreur signifie. L’agent lui-même est extrêmement basique:
#include #include JNIEXPORT jint JNICALL Agent_OnLoad(JavaVM *vm, char *options, void *reserved) { std::cout <<"Loading aspect..." <<std::endl; return JNI_OK; }
Toute aide concernant le message serait grandement appréciée.
La solution
Les options de ligne de commande que vous avez fournies à g ++ indiquent que vous essayez de créer un exécutable, pas une bibliothèque partagée. g ++ se plaint de ne pas avoir défini de fonction main
, chaque exécutable en nécessitant une.
Compilez votre bibliothèque partagée avec l'indicateur -c afin que g ++ sache construire une bibliothèque, c'est-à-dire compiler et assembler votre code, mais n'essayez pas de le lier dans un fichier exécutable.
g++ -c -o agent.so -I `/usr/libexec/java_home`/include agent.cpp