使用 CMake 在 android 应用程序中C++ libcurl

Using libcurl in C++ android application using CMake

本文关键字:C++ libcurl 应用程序 android CMake 使用      更新时间:2023-10-16

也许这个论坛上已经有一些关于这个问题的答案,但是我已经尝试了很多解决方案,但我仍然没有解决这个问题。

我必须使用C++制作一个Android应用程序,而使用libcurl。

无论我做什么,我都无法运行我的程序,因为它找不到库。

在我的.cpp中,我使用这一行:

#include <curl/curl.h>

这是我的CMakeList.txt

# Sets the minimum version of CMake required to build the native
# library. You should either keep the default value or only pass a
# value of 3.4.0 or lower.
cmake_minimum_required(VERSION 3.4.1)
# Creates and names a library, sets it as either STATIC
# or SHARED, and provides the relative paths to its source code.
# You can define multiple libraries, and CMake builds it for you.
# Gradle automatically packages shared libraries with your APK.
add_library( # Sets the name of the library.
             native-lib
             # Sets the library as a shared library.
             SHARED
             # Provides a relative path to your source file(s).
             # Associated headers in the same location as their source
             # file are automatically included.
             src/main/cpp/native-lib.cpp )
# Searches for a specified prebuilt library and stores the path as a
# variable. Because system libraries are included in the search path by
# default, you only need to specify the name of the public NDK library
# you want to add. CMake verifies that the library exists before
# completing its build.
find_library( # Sets the name of the path variable.
              log-lib
              -lcurl
              # Specifies the name of the NDK library that
              # you want CMake to locate.
              log
              -lcurl )
# Specifies libraries CMake should link to your target library. You
# can link multiple libraries, such as libraries you define in the
# build script, prebuilt third-party libraries, or system libraries.


INCLUDE_DIRECTORIES($/usr/include/)
target_link_libraries( # Specifies the target library.
                       native-lib
                       -lcurl
                       # Links the target library to the log library
                       # included in the NDK.
                       ${log-lib} )

我使用了命令:

sudo aptitude install libcurl4-gnutls-dev

sudo aptitude install libcurl-dev

你应该使用内置功能来集成libcurl:

[...]
find_package(CURL REQUIRED)
include_directories(${CURL_INCLUDE_DIRS})
add_library(native-lib SHARED src/main/cpp/native-lib.cpp) 
target_link_libraries(native-lib ${CURL_LIBRARIES})

由于您似乎正在为 Android 进行交叉编译,以下内容将使您为 Ubuntu 安装的 curl 库可用于编译(将其添加到上述内容之前)。

set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY BOTH)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE BOTH)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE BOTH)

但是在链接步骤中可能会出现问题,因为您为Ubuntu安装了库,并且要编译它的程序适用于Android。如果这不起作用,请尝试将 curl 库放在交叉编译工具集中(但我对它的了解不足以告诉您如何操作)。

我认为你需要指示 cmake 找到 libcurl 依赖项。
请阅读How_To_Find_Libraries。
看看find_package和FindCURL模块

作为快速入门,请将以下内容添加到 CMakeLists.txt:

find_package(CURL REQUIRED)  
include_directories(${CURL_INCLUDE_DIRS})  
add_library(native-lib SHARED  ... )
target_link_libraries(native-lib ${CURL_LIBRARIES})

(更好的是:使用 target_include_directories() 而不是 include_directories())。