2010-04-02 5 views
4

J'essaie de créer une application Java avec gcj mais en obtenant l'erreur ci-dessous. Ça fait un moment que j'ai utilisé gcj (un an ou deux), donc j'ai peut-être oublié quelque chose qui n'est pas évident mais je suis à peu près sûr que c'est comme ça que je l'ai toujours fait.GCJ Crée un symbole fictif en double

multiple definition of `java resource .dummy' 

versions gcj sont 4.4.1 sur Ubuntu et 4.3.4 sur Cygwin/Windows XP et je construis avec

gcj --main=my.MainClass --classpath=my my/*java 

Quelqu'un a vu ceci ou savoir une solution de contournement sans installer une version antérieure de gcj. Si c'est le moyen de le faire, quelqu'un sait-il comment le faire sur cygwin ou dois-je le construire?

Voici un test minimal qui donne cette erreur

public class A { 
    public static void main(String[] args) { 
     System.out.println(new B()); 
    } 
} 

public class B { 
    public String toString() { 
     return "Hello"; 
    } 
} 

gcj --main=A src/A.java src/B.java 

Répondre

5

Il y a 2 bugs déposés contre cette 42143 et 43302

La seule solution rapporté est de compiler des fichiers de classe, puis lier la classe des dossiers.

qui suit produit aucune erreur:

gcj -I src -C src/A.java src/B.java 
gcj -I src --main=A src/A.class src/B/class 
+0

Excellent, a parfaitement fonctionné sur les deux cygwin et ubuntu, merci – vickirk

3

Si vous construisez en compilant les fichiers .java à .o fichiers avec gcj -c, vous pouvez également résoudre le problème en rendant les symboles fictifs local avec objcopy:

objcopy -L '_ZGr8_$_dummy' A.o 

Cela fonctionne bien avec un Makefile - il suffit d'ajouter à la règle %.o: %.java:

objcopy -L '_ZGr8_$$_dummy' [email protected]  
1

Pas une solution au problème mentionné, mais une façon de compiler en code natif: 1. Dressez une archive jar en utilisant le soleil/OpenJDK 2. jar converti à l'exécutable en utilisant

gcj project.jar --main=package.name.ClassWithMainMethod 
2

A moins avec une version de gcj, spécifiant explicitement l'exécutable de sortie en utilisant -o va le faire fonctionner:

gcj --main = my.MainClass -o MyEXE --classpath = my my/* java

Je n'ai pas d'explication pour ce comportement.

+1

Cela a en effet travaillé pour moi, merci. – pts

Questions connexes