Я пытаюсь использовать библиотеки Poco C ++ в проекте и столкнулся с некоторыми проблемами при сборке для Android.
Я использую менеджер пакетов Conan C ++ в качестве основы, но я включил исходные тексты Poco в проект и включил его подкаталог в CMakeLists.txt верхнего уровня проекта, чтобы сделать процесс более прозрачным.
Если я собираю проект с библиотеками Poco, которые не зависят от OpenSSL, он собирается нормально. Если я добавлю PSSO NetSSL, я получу некоторые проблемы, связанные с math.h:
In file included from /home/uname/storage/projects/-some-project-/thirdparty/poco/Crypto/src/Cipher.cpp:15:
In file included from /home/uname/storage/projects/-some-project-/thirdparty/poco/Crypto/include/Poco/Crypto/Cipher.h:22:
In file included from /home/uname/storage/projects/-some-project-/thirdparty/poco/Foundation/include/Poco/RefCountedObject.h:22:
In file included from /home/uname/storage/projects/-some-project-/thirdparty/poco/Foundation/include/Poco/MemoryPool.h:24:
In file included from /home/uname/storage/projects/-some-project-/thirdparty/poco/Foundation/include/Poco/NestedDiagnosticContext.h:24:
In file included from /home/uname/storage/projects/-some-project-/thirdparty/poco/Foundation/include/Poco/OrderedMap.h:28:
In file included from /home/uname/storage/projects/-some-project-/thirdparty/poco/Foundation/include/Poco/ordered_hash.h:31:
/home/uname/.conan/data/android-ndk/r18/theodelrieu/testing/package/2296cbf988942dec6e0ebdfef682b5c678acade8/sources/cxx-stl/llvm-libc++/include/cmath:313:9: error: no member named 'signbit' in the global
namespace; did you mean '__signbit'?
using ::signbit;
~~^
/usr/include/bits/mathcalls-helper-functions.h:25:20: note: '__signbit' declared here
__MATHDECL_1 (int, __signbit,, (_Mdouble_ __value))
Насколько я знаю, это связано с тем, что файл math.h только для C был включен ранее в путь как libc ++ math.h. У кого-нибудь есть идеи, как решить эту проблему?
На самом деле я пытаюсь найти решение для сборки и компоновки библиотек Poco, которые не собираются правильно для Android (из-за некоторых проблем сборки с зависимостью OpenSSL) при использовании зависимостей Conan и требований к сборке android-ndk / r18 @ theodelrieu / testing или android_ndk_installer / r19b @ bincrafters / stable в Ubuntu 18.04. Поэтому я пытаюсь собрать библиотеки Poco и OpenSSL без использования пакетов Conan.
Заранее благодарим за любую подсказку или идею!
Это мой профиль Конана для Android:
# --------------------------------------------------------------------------------------------------------------------
# PARAMETERS
#standalone_toolchain=/home/uname/Android/ndk/android-ndk-r19b/toolchains/llvm/prebuilt/linux-x86_64
target_host=armv7a-linux-androideabi
ar_host=arm-linux-androideabi
api_level=21
cc_compiler=clang
cxx_compiler=clang++
# --------------------------------------------------------------------------------------------------------------------
[settings]
os_build=Linux
arch_build=x86_64
compiler=clang
compiler.version=7.0
compiler.libcxx=libc++
os=Android
os.api_level=$api_level
arch=armv7
#Debug/Release
build_type=Debug
# --------------------------------------------------------------------------------------------------------------------
[build_requires]
android-ndk/r18@theodelrieu/testing
#android_ndk_installer/r19b@bincrafters/stable
# --------------------------------------------------------------------------------------------------------------------
[options]
*:shared=False
#Poco:no_asm=True
# --------------------------------------------------------------------------------------------------------------------
[env]
CONAN_CMAKE_FIND_ROOT_PATH=$standalone_toolchain/sysroot
PATH=[$standalone_toolchain/bin]
CHOST=$target_host
# Flags can be also appended after the path to the compiler
CC=$target_host$api_level-$cc_compiler
CXX=$target_host$api_level-$cxx_compiler
CMAKE_C_COMPILER=$CC
CMAKE_CXX_COMPILER=$CXX
AR=$ar_host-ar
AS=$ar_host-as
RANLIB=$target_host-ranlib
LD=$target_host-ld
STRIP=$target_host-strip
CFLAGS= -fPIE -fPIC -I$standalone_toolchain/include/c++/4.9.x
CXXFLAGS= -fPIE -fPIC -I$standalone_toolchain/include/c++/4.9.x
LDFLAGS= -pie
export ANDROID_API=$api_level
OpenSSL:compiler=clang
OpenSSL:options.no_zlib=True
И root CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(-some-project-)
include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
conan_basic_setup()
## Experimental POCO
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/openssl/include) # Path whererever the openssl-dev headers are present
# When compiling the POCO C++ Libraries for a Android target, as well as when including POCO C++ Libraries headers in a project for a Android target, the preprocessor macro POCO_ANDROID must be defined. This is because the Android NDK GCC compiler does not provide a predefined macro that allows for reliable detection of an Android target.
IF(ANDROID)
SET(POCO_ANDROID)
ENDIF()
SET(ENABLE_ENCODINGS OFF)
SET(ENABLE_ENCODINGS_COMPILER OFF)
SET(ENABLE_XML OFF)
SET(ENABLE_JSON ON)
SET(ENABLE_MONGODB OFF)
SET(ENABLE_REDIS OFF)
SET(ENABLE_PDF OFF)
SET(ENABLE_UTIL OFF)
SET(ENABLE_NET ON)
SET(ENABLE_NETSSL ON)
SET(ENABLE_NETSSL_WIN OFF)
SET(ENABLE_CRYPTO OFF)
SET(ENABLE_DATA OFF)
SET(ENABLE_DATA_SQLITE OFF)
SET(ENABLE_DATA_MYSQL OFF)
SET(ENABLE_DATA_ODBC OFF)
SET(ENABLE_SEVENZIP OFF)
SET(ENABLE_ZIP OFF)
SET(ENABLE_APACHECONNECTOR OFF)
SET(ENABLE_CPPPARSER OFF)
SET(ENABLE_POCODOC OFF)
SET(ENABLE_PAGECOMPILER OFF)
SET(ENABLE_PAGECOMPILER_FILE2PAGE OFF)
SET(FORCE_OPENSSL OFF) # Force usage of OpenSSL even under windows
SET(ENABLE_TESTS OFF) # Set to OFF|ON (default is OFF) to control build of POCO tests & samples
SET(POCO_STATIC ON) # Set to OFF|ON (default is OFF) to control build of POCO as STATIC library
SET(POCO_UNBUNDLED OFF) # Set to OFF|ON (default is OFF) to control linking dependencies as external
SET(POCO_BUILD_TYPE "Release")
add_subdirectory(thirdparty/poco)
#SET(OPENSSL_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/openssl")
## \Experimental POCO
add_subdirectory(src)
IF(CMAKE_BUILD_TYPE STREQUAL "Debug")
add_subdirectory(test)
ENDIF()
PS: я использую правильный подход или я должен попытаться включить и собрать библиотеки Poco и OpenSSL для Android по-другому? Основные цели - устройства Android и iOS и локальные macOS или Linux для разработки и тестирования.