Невозможно связать статическую библиотеку libCurl.a в CMake на Android - PullRequest
0 голосов
/ 30 августа 2018

Я новичок в CMake и провел почти 2 недели в поисках по всему Интернету, пытаясь выяснить, почему я не могу связать статические библиотеки libcurl с моими исходниками cpp в Cmake в рамках моего проекта Android.

Я нашел этот репозиторий: https://github.com/gcesarmza/curl-android-ios, который использовал для создания статических библиотек для libcurl. У него есть зависимости с openssl и libz (я не знаю, с чем еще он собран)

Вот мой cmake:

cmake_minimum_required(VERSION 3.4.1)

include_directories(
    ${EXTERNAL}/libCurl/include/
    #${EXTERNAL}/openssl/include/
)

add_library(
    libcurl
    STATIC IMPORTED SHARED
)

set_target_properties(
    libcurl
    PROPERTIES IMPORTED_LOCATION
    ${EXTERNAL}/libcurl/lib/android/libcurl.a
)

add_library(
    libz
    STATIC IMPORTED
)

set_target_properties(
    libz
    PROPERTIES IMPORTED_LOCATION
    ${EXTERNAL}/zlib/lib/armeabi-v7a/libz.a
)

set(WHARE_LIBRARY Whare_Native)

add_library(
         ${WHARE_LIBRARY}
         SHARED

         ${CPP_SOURCE}/MyWebRequest.cpp
         )

target_link_libraries(
     ${WHARE_LIBRARY}
     libcurl
     libz
 )

У меня есть простая реализация cpp, которая делает вызовы curl, такие как curl_easy_init (). Я получаю следующую ошибку компоновщика при сборке проекта с этим файлом CMake:

[9/9] Linking CXX shared library 
../../../../build/intermediates/cmake/debug/obj/arm64- 
v8a/libWhare_Native.so
FAILED: : && /Users/jay.nagar/Library/Android/sdk/ndk- 
bundle/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++  -- 
target=aarch64-none-linux-android --gcc- 
.........
.........
.........
.........
WhareWebRequest.cpp:40: undefined reference to `curl_easy_init'
clang++: error: linker command failed with exit code 1 (use -v to see 
invocation)
ninja: build stopped: subcommand failed.

Я потратил несколько дней на Stackoverflow, GitHub и другие источники, а также пробовал множество предложенных решений, таких как:

Как использовать libcurl как статическую библиотеку с cmake?

и

Связывание статических библиотек с помощью c ++ / cmake

Я также посмотрел официальную документацию CMake, чтобы понять различные свойства. Я экспериментировал с CFLAGS, CURL_LIBRARY, find_library и что нет. Как я уже сказал, я абсолютный новичок, когда дело доходит до конфигураций Cmake. Может кто-нибудь понять тип ошибки, которую я получаю? Я думаю, что это связано с проблемами, связанными со статическими библиотеками, но я не уверен. Может кто-нибудь помочь отладить эту проблему, в которой я нахожусь много дней!

Спасибо и помощь очень ценится!

https://imgur.com/a/gLN9ctq enter image description here

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

Проблема была в неправильно сгенерированных библиотеках для статических библиотек libcurl. Я нашел несколько готовых файлов .a, которые работали для меня: https://github.com/gcesarmza/curl-android-ios/tree/master/prebuilt-with-ssl/android а также https://github.com/djp952/prebuilt-libz

Мне просто повезло, что я нашел кое-что из нескольких готовых библиотек, которые просто сработали. Я был бы счастлив, если бы мог создать их сам, но в любом случае, по крайней мере, я не заблокирован:)

0 голосов
/ 30 августа 2018

libcutils.so является частной системной библиотекой и больше не может быть привязано приложением с 24 уровня API.

Смотрите эту ссылку Как решить UnsatisfiedLinkError?

---- Редактировать ----

Необходимо указать правильный статический путь к библиотеке для каждого Android ABI, используя CMake переменная ${ANDROID_ABI}.

Изменить ниже код

set_target_properties(
    libcurl
    PROPERTIES IMPORTED_LOCATION
    ${EXTERNAL}/libcurl/lib/android/libcurl.a
)

до

set_target_properties(
    libcurl
    PROPERTIES IMPORTED_LOCATION
    ${EXTERNAL}/libcurl/lib/android/${ANDROID_ABI}/libcurl.a
)

И убедитесь, что у вас есть все необходимые архитектуры (ABI) вашего libcurl.a, например. armeabi-v7a, arm64-v8a, x86, x86_64

...