Compilare l'agente JVMTI (usando GCC, su OSX Snow Leopard)
-
07-07-2019 - |
Domanda
Sto cercando di creare un agente JVMTI usando il comando g ++ su Snow Leopard e ottengo il seguente errore:
$ 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
Sono un principiante assoluto quando si tratta di programmazione gcc e C ++, quindi non ho idea di cosa significhi quell'errore. L'agente stesso è estremamente semplice:
#include #include JNIEXPORT jint JNICALL Agent_OnLoad(JavaVM *vm, char *options, void *reserved) { std::cout <<"Loading aspect..." <<std::endl; return JNI_OK; }
Qualsiasi aiuto con il messaggio sarebbe molto apprezzato.
Soluzione
Le opzioni della riga di comando fornite a g ++ indicano che stai tentando di creare un eseguibile, non una libreria condivisa. g ++ si lamenta di non aver definito una funzione main
, poiché ogni eseguibile ne richiede una.
Compila la tua libreria condivisa con il flag -c in modo che g ++ sappia costruire una libreria, ovvero compila e assembla il tuo codice, ma non provare a collegarlo in un file eseguibile.
g++ -c -o agent.so -I `/usr/libexec/java_home`/include agent.cpp