Как выборочно использовать несколько библиотек, скомпилированных с одним и тем же кодом, но с разными флагами компилятора - PullRequest
0 голосов
/ 12 июня 2018

Мы создаем библиотеку C ++ (скажем, libCore), которая будет использоваться из другой библиотеки C ++ (скажем, libClient).Мы используем Android NDK (использует clang) с CMake.

В нашем случае мы имеем несколько сборок libCore, оптимизированных на основе функций процессора, доступных на целевых устройствах.Например, libCore-neon для устройств с ARM NEON fpu и libCore-simd для устройств без NEON.

Кстати, эти libCore-xxxx созданы из одного и того же исходного кода.Единственное отличие состоит в том, что libCore-neon построен с флагами компилятора, специфичными для NEON (-mfpu=neon), которые не используются для libCore-simd.

Теперь libClient должен проверить, имеет ли устройство NEON во время выполнения, и использоватьlibCore-neon, если нет, он должен использовать libCore-simd.

Одним из решений является загрузка библиотеки во время выполнения с использованием dlopen.Мы не предпочитаем его, так как не считаем его безопасным для использования во всех версиях Android.

Все они принадлежат одной и той же кодовой базе.Не имеет значения, являются ли эти библиотеки статическими или общими.Они даже не должны быть отдельными библиотеками.Мы просто хотим избежать дублирования кода, так как один и тот же код компилируется с разными флагами.

Есть ли какой-то другой подход, который мы можем использовать для запуска наиболее оптимизированного кода, работающего на соответствующих устройствах?

...