Проблема компоновщика при использовании предварительно созданной статической библиотеки LuaJIT с Android под cygwin

Я думаю, что большую часть вчерашнего дня я безуспешно боролся с этим, любая помощь будет очень признательна и сделает меня очень счастливым! Даже следующий шаг, чтобы попытаться найти корень проблемы, - это то, на чем я застрял в данный момент!

У меня есть проект Android 2.2, который пытается ссылаться на предварительно созданную статическую библиотеку LuaJIT, но ndk-build выдает эту ошибку:

test_android.cpp:25: undefined reference to `luaL_newstate' 

Я создал LuaJIT как liblua.a, я поместил его в корень моего каталога JNI с соответствующими заголовками. У меня есть один Android.mk, как показано ниже:

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := lua
LOCAL_SRC_FILES := liblua.a

include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE    := test
LOCAL_CFLAGS    := -Werror
LOCAL_SRC_FILES := test_android.cpp
LOCAL_LDLIBS    := -llog -lGLESv2

LOCAL_STATIC_LIBRARIES := lua
include $(BUILD_SHARED_LIBRARY)

В test_andrdoid.cpp у меня есть этот код:

extern "C"
{
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
}

void test()
{
    lua_State* lua = lua_open();
}

Это похоже на ошибку компоновщика, по какой-то причине на файл статической библиотеки не ссылаются правильно. Но мне makefile кажется правильным.

Любая помощь будет принята с благодарностью!

  1. Для начала: можно ли как-то увидеть, как все связано вместе, и действительно ли мой модуль общей библиотеки получает доступ к статической библиотеке?

Дополнительная информация

Вот дополнительная информация, которая, я думаю, может быть актуальной!

Создание библиотеки

Может быть, это неправильный файл статической библиотеки? (Есть ли где-нибудь, где я мог бы скачать готовую версию, чтобы проверить?). Я сделал это с помощью этого скрипта (с веб-сайта LuaJIT). Я использую последнюю стабильную версию LuaJIT, 1.1.8.

NDK=/cygdrive/c/android-ndk-r8b
NDKABI=8
NDKVER=$NDK/toolchains/arm-linux-androideabi-4.4.3
NDKP=$NDKVER/prebuilt/linux-x86/bin/arm-linux-androideabi-
NDKF="--sysroot $NDK/platforms/android-$NDKABI/arch-arm"
make linux HOST_CC="gcc -m32" CROSS=$NDKP TARGET_FLAGS="$NDKF"

Это отлично строится и создает liblua.a в каталоге /src/. (Я запустил на нем nm, и он перечислил все прототипы функций, которые я ожидал). Я не знаю, могу ли я сделать что-нибудь еще, чтобы убедиться, что это действительно сборка для ARM?

NDKABI=8 означает, что я ориентируюсь на Android 2.2.

Настройка тестового проекта Android

Я создаю новый проект Android 2.2, используя эту команду:

android create project --target 3 --name test --path . --activity TestActivity --package com.test

Настройте 3 карты на Android 2.2 в моей системе (используя android list devices). Я создаю папку jni и имею test_android.h и test_android.cpp. Затем я использую ndk-build для их сборки, что отлично работает, когда я не пытаюсь ссылаться на LuaJIT. Когда я пытаюсь использовать Lua, я получаю следующую ошибку:

Полное сообщение об ошибке

Cygwin         : Generating dependency file converter script
Compile++ thumb  : test <= test_android.cpp
In file included from jni/test_android.h:3:0, from jni/test_android.cpp:2:
    C:/android-ndk-r8b/platforms/android-8/arch-arm/usr/include/jni.h:592:13: note:
    the mangling of 'va_list' has changed in GCC 4.4
Prebuilt       : liblua.a <= jni/
StaticLibrary  : libstdc++.a
SharedLibrary  : libtest.so
obj/local/armeabi/objs/test/test_android.o: In function `test()':
C:\Users\Grrr\Documents\mycode\static_lib_test/jni/test_android.cpp:25: undefined reference to `luaL_newstate'
collect2: ld returned 1 exit status
/cygdrive/c/android-ndk-r8b/build/core/build-binary.mk:378: recipe for target `obj/local/armeabi/libtest.so' failed make: *** [obj/local/armeabi/libtest.so] Error 1

Большинство проблем, которые я видел при поиске, связаны с порядком включения локальной библиотеки, поскольку у меня есть только одна библиотека, это не должно быть проблемой и предполагает, что мне удалось сделать что-то более фундаментальное неправильно :)

Обновлять

С тех пор я построил обычный Lua и добавил его как готовую статическую библиотеку, и она отлично работает. Я подозреваю, что это то, как я построил LuaJIT, но я не уверен, как правильно его собрать или найти работающую готовую версию.


person Balaam    schedule 15.09.2012    source источник


Ответы (1)


Связывание для этого было в порядке, или, по крайней мере, makefile был в порядке. Проблема заключалась в том, что библиотека LuaJIT не была создана для ARM (чтобы проверить это, я использовал objdump -a lualib.a). Я скачал последнюю версию LuaJIT, запустил скрипт под linux и получил библиотеку ARM. Теперь все хорошо связывается!

person Balaam    schedule 15.09.2012
comment
если вы решили проблему .. примите ответ, даже если он ваш собственный - person nandeesh; 15.09.2012