2013-02-20 101 views
1

的代碼是這樣的:GCJ鏈接錯誤:說的錯誤:未定義的引用「主」 collect2:錯誤:LD返回1個退出狀態

public class Thingy 
{ 
    public static void main(String[] args) 
    { 
    System.out.println(Math.random()); 
    } 
} 

所以,絕對不是一個不尋常的情況下,只是一個基本的例子。

當我嘗試使用GCJ的javac實現來製作字節碼而不是OpenJDK時,它工作正常。

[email protected]:~/javastuff$ javac Thingy.java 
[email protected]:~/javastuff$ java Thingy 
0.2794511843566371 

但是,當我嘗試讓GCJ生成本地代碼時,我得到該鏈接器錯誤。如果你願意,我可以給你詳細的輸出:

[email protected]:~/javastuff$ gcj --verbose Thingy.java 
Using built-in specs. 
Reading specs from /usr/lib/gcc/x86_64-linux-gnu/4.7/libgcj.spec 
rename spec startfile to startfileorig 
rename spec lib to liborig 
COLLECT_GCC=gcj 
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.7/lto-wrapper 
Target: x86_64-linux-gnu 
Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.7.2-1ubuntu1' --with-bugurl=file:///usr/share/doc/gcj-4.7/README.Bugs --enable-languages=c,c++,java --prefix=/usr --program-suffix=-4.7 --enable-shared --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.7 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-libmudflap --enable-plugin --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.7/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.7 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.7 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --disable-werror --with-arch-32=i686 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu 
Thread model: posix 
gcc version 4.7.2 (Ubuntu/Linaro 4.7.2-1ubuntu1) 
COLLECT_GCC_OPTIONS='-fsaw-java-file' '-v' '-fbootclasspath=./:/usr/share/java/libgcj-4.7.jar' '-g1' '-shared-libgcc' '-mtune=generic' '-march=x86-64' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/ecj1 Thingy.java -g1 -fbootclasspath=./:/usr/share/java/libgcj-4.7.jar -g1 -fsource=1.5 -ftarget=1.5 -fzip-dependency /tmp/cckwg5AG.zip -fzip-target /tmp/ccbixA8G.jar 
COLLECT_GCC_OPTIONS='-fsaw-java-file' '-v' '-fbootclasspath=./:/usr/share/java/libgcj-4.7.jar' '-g1' '-shared-libgcc' '-mtune=generic' '-march=x86-64' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/jc1 /tmp/ccbixA8G.jar -fsource-filename=Thingy.java -fhash-synchronization -fno-use-divide-subroutine -fuse-boehm-gc -fnon-call-exceptions -fkeep-inline-functions -quiet -dumpbase Thingy.java -mtune=generic -march=x86-64 -auxbase Thingy -g1 -version -fsaw-java-file -fbootclasspath=./:/usr/share/java/libgcj-4.7.jar -faux-classpath /tmp/cckwg5AG.zip -o /tmp/cclZeoeJ.s 
GNU Java (Ubuntu/Linaro 4.7.2-1ubuntu1) version 4.7.2 (x86_64-linux-gnu) 
    compiled by GNU C version 4.7.2, GMP version 5.0.2, MPFR version 3.1.0-p3, MPC version 0.9 
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 
GNU Java (Ubuntu/Linaro 4.7.2-1ubuntu1) version 4.7.2 (x86_64-linux-gnu) 
    compiled by GNU C version 4.7.2, GMP version 5.0.2, MPFR version 3.1.0-p3, MPC version 0.9 
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 
Class path starts here: 
    /tmp/cckwg5AG.zip/ (zip) 
    ./ (system) 
    /usr/share/java/libgcj-4.7.jar/ (system) (zip) 
COLLECT_GCC_OPTIONS='-fsaw-java-file' '-v' '-fbootclasspath=./:/usr/share/java/libgcj-4.7.jar' '-g1' '-shared-libgcc' '-mtune=generic' '-march=x86-64' 
as -v --64 -o /tmp/cczIy0oL.o /tmp/cclZeoeJ.s 
GNU assembler version 2.22.90 (x86_64-linux-gnu) using BFD version (GNU Binutils for Ubuntu) 2.22.90.20120924 
COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/4.7/:/usr/lib/gcc/x86_64-linux-gnu/4.7/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.7/:/usr/lib/gcc/x86_64-linux-gnu/ 
LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/4.7/:/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../:/lib/:/usr/lib/ 
COLLECT_GCC_OPTIONS='-fsaw-java-file' '-v' '-fbootclasspath=./:/usr/share/java/libgcj-4.7.jar' '-g1' '-shared-libgcc' '-mtune=generic' '-march=x86-64' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/collect2 --sysroot=/ --build-id --no-add-needed --as-needed --eh-frame-hdr -m elf_x86_64 --hash-style=gnu -dynamic-linker /lib64/ld-linux-x86-64.so.2 /usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/crt1.o /usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/4.7/crtbegin.o -L/usr/lib/gcc/x86_64-linux-gnu/4.7 -L/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/4.7/../../.. /tmp/cczIy0oL.o -lgcc_s -lgcc -lgcj -lm -lpthread -lrt -lz -ldl -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-linux-gnu/4.7/crtend.o /usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/crtn.o 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/crt1.o(.text+0x20): error: undefined reference to 'main' 
collect2: error: ld returned 1 exit status 

所以,我想我的問題是,沒有任何人有任何想法可能是什麼地方出了錯?

+0

並且我確定它是我正在使用的javac的GCJ版本。我只是在幾分鐘前使用'update-alternatives'將它設置爲 – user2093092 2013-02-20 21:56:06

+0

,並且鏈接器似乎沒有被破壞,以至於不能排除GCC族的編譯。我實際上並不知道任何C,但作爲一般gcc家族的理智測試,我從維基百科複製了一個C的hello world,並通過'gcc'命令運行它,它編譯得很好。沒有鏈接器錯誤。 – user2093092 2013-02-20 22:05:06

+0

它看起來像我可能不需要GCJ爲我正在嘗試做什麼。儘管如此,我覺得這個錯誤很奇怪,所以迴應仍然會有點讚賞,因爲我很好奇。但我不是絕望或任何事情。 – user2093092 2013-02-21 18:04:56

回答

3

我想你需要在命令中加上--main=Thingy。由於幾個類可能有一個'主要'方法,鏈接器需要被告知使用哪一個。此外,您可能還想添加-o <name of executable>,否則,您會得到一個'a.out'文件,這是GNU編譯器(實際上是任何C編譯器)的默認可執行文件名。

Regards

+0

謝謝,修復了它。 – user2093092 2013-02-28 16:47:15

相關問題