2012-05-02 88 views
4

我正在爲ndk編譯應用程序,我收到錯誤「未定義引用__errno_location'」。未定義引用`__errno_location'

這個錯誤來自行

sprintf(buff, "%s TIOCMGET failed: %s\n", buff, strerror(errno)); 

如果我評論這一行,鏈接器不會抱怨,否則同樣的它。

我想用Sourcery G ++ Lite的arm-none-linux-gnueabi-gcc工具鏈爲Android構建我自己的可執行文件。

回答

5

從我能收集到的信息來看,你的編譯器引用了一個符號__errno_location,這個符號在連接器正在查看的任何庫中都找不到。

這表明,無論是:

  1. 您沒有正確的庫;或
  2. 您確實有正確的庫,但它們沒有提供給鏈接器;或
  3. 您沒有正確的標題。

如果標題與庫不匹配,則符號可能會有錯誤的名稱,因此您可能會收到此類鏈接錯誤。

看來你正在包括編譯器的LibC頭文件,然後連接到可能並不總是工作的android庫。

+0

嗯...下面是我的編譯步驟:'arm-none-linux-gnueabi-gcc -I \ Apps \ Android \ GT-I9100G_OpenSource \ kernel \ include -I「\ Apps \ CodeSourcery \ Sourcery G ++ Lite \ arm -none-linux-gnueabi \ libc \ usr \ include「-c hello.c -o hello.o arm-none-linux-gnueabi -ld -entry = _start --dynamic-linker/system/bin/linker -nostdlib -rpath/system/lib -rpath-link \ apps \ android \ system \ lib -L ​​\ apps \ android \ system \ lib -lc -l android_runtime -l sqlite -o hellodynamic2 hello.o crt0.o'你是否發現任何錯誤在這裏? –

+1

看起來你正在包含來自G ++ LibC的頭文件,但是與Android LibC鏈接 - 嘗試從android平臺中包含LibC頭文件。 – Nick

+0

通過android平臺,你的意思是內核源碼還是NDK? –