Как связать код C и C ++ вместе с библиотеками времени выполнения C и C ++ (включая STL) на android ndk? - PullRequest
0 голосов
/ 20 июня 2020

У меня большая база кода со смешанным кодом C и C ++. Он встроен в библиотеки, а затем в исполняемый файл, работающий на устройствах на базе android. Это «внешняя система сборки», которая не использует gradle. После того, как вся компиляция и библиотеки построены, последняя команда компоновки будет выглядеть примерно так:

armv7a-linux-androideabi30-clang++ -pie -static-libstdc++ -o a.out -L...-lmylib1 -lmylib2 -lm -llog

Когда программа запускается, я получаю «не могу найти символ fread_unlocked». Когда я смотрю на расширение этой команды ссылки под капотом с помощью - ###, clang ++ автоматически добавляет -l c и -lg cc среди других библиотек (в противном случае я бы добавил их сам).

С другой стороны, я попытался связать c ++ stdlib (stl one, libc ++) с C компоновщиком

armv7a-linux-androideabi30-clang -o a.out -L...-lmylib1 -lmylib2 -lm -llog -lc++

Когда программа выполняется, я получаю сообщение «не могу найти libc ++ _ shared.so ". Я не хочу копировать какие-либо общие библиотеки вместе с моим приложением, поэтому я предпочитаю, чтобы библиотека c ++ была статически связана, но я не вижу способа сделать это с помощью clang. Если я попытаюсь статически связать все это с помощью -stati c, он не сможет найти stati c версии liblog среди других. И я подтвердил, что в последней версии ndk нет liblog.a (только liblog.so).

Итак, я считаю, что моя основная c потребность - связать смесь кода C и C ++, вместе со средами выполнения C и C ++ и не имеют общих зависимостей библиотеки от цели.

1 Ответ

0 голосов
/ 24 июня 2020

Я создавал для API 30 и работал на более старой цели. Я изменил команду ссылки на armv7a- linux -androidabi23-clang ++, и она сработала.

...