2

我使用 gcj(Cygwin 版本)编译 2 个 java 文件

$ gcj --version gcj (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125) 版权所有 (C) 2004 Free Software Foundation, Inc. 这是免费软件;查看复制条件的来源。没有保修;甚至不考虑适销性或特定用途的适用性。

这是我的 2 个 java 文件:

$ cat MyClass.java

public class MyClass {  
   public MyClass() {  
      System.out.println("Hello, MyClass");  
   }  
} 

$猫HelloWorld.java

public class HelloWorld {  
   public static void main(String[] args) {  
      MyClass myclass = new MyClass();  
      System.out.println("Hello, World");  
   }   
}

我可以在 HelloWorld 中执行代码

$ gcj.exe -o hello --main=HelloWorld --classpath=. HelloWorld.java MyClass.java

我想单独编译它们

gcj.exe -C MyClass.java

然后

gcj.exe  --main=HelloWorld --classpath=. HelloWorld.java

问题是我得到

/tmp/ccKwa7F4.o: In function '_ZN10HelloWorld4mainEP6JArrayIPN4java4lang6StringEE':  
/home/lucm/HelloWorld.java:3: undefined reference to `MyClass::class$'  
/home/lucm/HelloWorld.java:3: undefined reference to `MyClass::MyClass()'  
collect2: ld returned 1 exit status
4

1 回答 1

3

编译为.o 时,链接模型基本上是类C 的。您必须编译所有文件。因此,您要做的是将每个编译为 .o 并链接结果:

gcj -c MyClass.java
gcj -c HelloWorld.java
gcj --main=HelloWorld MyClass.o HelloWorld.o

当引入二进制兼容性 ABI 时,此规则在 gcj 的更高版本中有一些例外。以上是使其工作的最基本方法。

于 2013-06-01T19:21:26.203 回答