Я генерирую статическую библиотеку из другого проекта Android, поэтому уверен, что они пригодны для использования.

У меня есть четыре файла .a на основе архитектур ЦП, один файл .h, который также был протестирован.

Теперь в новом проекте другой файл .c хочет вызвать статическую библиотеку, я не могу объединить два проекта, статические библиотеки должны вызываться в формате .a.

Я получил сообщение «Ошибка CMake: CMake не может определить язык компоновщика для целевого объекта», это мой файл CMakeLists.txt:

add_library(
    mylib
    STATIC
    src/main/jniLibs/arm64-v8a/libmylib.a
    src/main/jniLibs/armeabi-v7a/libmylib.a
    src/main/jniLibs/x86/libmylib.a
    src/main/jniLibs/x86_64/libmylib.a
)

target_link_libraries(
    native-lib
    mylib
)

Mylib - это предварительно созданная библиотека. native-lib хочет вызвать mylib.

Также приветствуется ссылка на то, как добавить файл .a в проект с нуля.

2
outcast 23 Окт 2018 в 14:22

2 ответа

Лучший ответ
add_library(
        my_static_lib
        STATIC
        IMPORTED
)
set_target_properties(features PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libmy_static_lib.a)

Как видите, я поместил эти файлы .a в

projectNmae\app\src\main\jniLibs\${ANDROID_ABI}\ ,

Если вы измените местоположение, не забудьте указать его в CMakeList.txt.

Я помещаю my_static_lib.h в src\main\include и использую его в другом файле .c/cpp, например:

#include "../include/features.h"

Моя САМАЯ БОЛЬШАЯ ошибка - это упущенная:

${CMAKE_SOURCE_DIR}

CMake не может найти библиотеку STATIC в таких местах, как src/main/app/native-lib.c, библиотека SHARED в порядке, а не библиотека STATIC , что очень странно.

И IMPORTED является обязательным, я пытался заменить его на весь путь к местоположению, не сработает.

Спасибо за все комментарии и ответы, надеюсь, этот ответ поможет новичкам вроде меня.

2
outcast 5 Ноя 2018 в 10:15

Вам следует связать существующие статические библиотеки с текущей общей библиотекой, т. Е. .so. Например, у вас есть src/c/dummy.c. Тогда ваш CMakeLists.txt должен выглядеть примерно так:

add_library(my-shared-lib SHARED src/c/dummy.c)

target_link_libraries(my-shared-lib -Wl, --whole-archive src/main/jniLibs/${ANDROID_ABI}/libmylib.a -Wl,--no-whole-archive)

< Сильный > Разъяснения

  • ${ANDROID_ABI} - это переменная CMake для идентификации текущего строящегося ABI, то есть arm64-v8a, arm64-v8a, x86, x86_64.
1
shizhen 23 Окт 2018 в 15:03
52947801