Связывание с библиотекой общего объекта (.so) при кросс-компиляции - PullRequest
1 голос
/ 29 апреля 2020

Я пытаюсь связать мою c -программу с библиотекой общих объектов (libfoo.so), используя кросс-компилятор ARM arm- linux -gnueabi-g cc. Я компилирую в системе Ubuntu и хочу запустить программу на устройстве Android. Компиляция работает, но когда я пытаюсь запустить программу на моем устройстве android, я получаю сообщение об ошибке.

Я создал простую тестовую программу, содержащую следующие файлы:

foo. c:

#include <stdio.h>
void foo(void){ puts("Hello, I am a shared library"); }

foo.h :

#ifndef foo_h__
#define foo_h__
extern void foo(void);
#endif

main. c:

#include <stdio.h>
#include "foo.h"
int main(void)
{
    puts("This is a shared library test...");
    foo();
    return 0;
}

Затем я создал библиотеку общих объектов, используя:
arm-linux-gnueabi-gcc -c -fPIC foo.c
arm-linux-gnueabi-gcc -shared -o libfoo.so foo.o

Затем я скомпилировал свою программу, используя:
arm-linux-gnueabi-gcc -L/home/foo -o test main.c -lfoo

После загрузки тестовой программы на устройство Android с помощью adb я не могу ее запустить. Вместо этого я получаю сообщение об ошибке:
/system/bin/sh: ./test: No such file or directory
Я нахожусь в правильном каталоге, и тестовый файл присутствует, поэтому я предполагаю, что это общая библиотека, которая не может быть найдена. Я также попытался загрузить libfoo.so на устройство android (по тому же пути, который указан при компиляции), но он все равно не работает для запуска программы.

Я получил его работать с библиотекой stati c (foo.o), используя arm- linux -gnueabi-g cc -stati c -o test main. c foo.o , но не с общей библиотекой.

Как правильно связать общую библиотеку при кросс-компиляции, чтобы обеспечить возможность запуска программы на устройстве Android?

1 Ответ

1 голос
/ 29 апреля 2020

Компоновщик не может динамически связываться с библиотекой.

Определите переменную среды LD_LIBRARY_PATH, чтобы включить библиотеку:

export LD_LIBRARY_PATH=/home/foo
...