使用未声明的标识符“_ISspace”

Posted

技术标签:

【中文标题】使用未声明的标识符“_ISspace”【英文标题】:use of undeclared identifier '_ISspace' 【发布时间】:2019-11-18 22:29:56 【问题描述】:

我正在尝试使用 android-ndk-r20 为 android 构建 C 库。 我正在使用 CMake 构建我的库。

架构是android-arm64

问题是我在编译过程中遇到以下错误:

/home/erez/android-ndk-r20/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/c++/v1/__locale:382:32: 错误:

同样的错误适用于所有类型的宏 - _ISprint_IScntrl 等。

我试图在谷歌中查找它,但没有提到这个宏,这很奇怪。

当我打开这个文件时,我确实看到了这个宏的一些用途。

我已尝试查找它,但找不到定义此宏的任何位置。 这让我很困惑,因为我假设 nkd/LLVM 将包含所有需要的头文件和库,但我无法在任何地方找到这个头文件。

这是我的 CMake 命令:

cmake -DCMAKE_CXX_FLAGS:STRING="-std=c++11" -DANDROID_NATIVE_API_LEVEL=24 -DTARGET=android -DANDROID_ABI=arm64-v8a -DLIBRARY_OUTPUT_PATH_ROOT=pwd/../android_output -DCMAKE_TOOLCHAIN_FILE=pwd/../../../../../android-ndk -r20/build/cmake/android.toolchain.cmake -DBUILD_DATE=$(日期 +%Y-%m-%d) ../../rootCmake ;使 VERBOSE=1 安装;

有人知道我该如何解决这个问题吗?

编辑:

根 CMakeLists.txt:

project(Osn)
cmake_minimum_required(VERSION 2.8)

set(TARGET "android" CACHE STRING "Set the target ios mac32/64, linux32/64, android, win32/64")

# Static link the c++ library in case of a gcc compiler.
if (CMAKE_COMPILER_IS_GNUCC)
  include($CMAKE_CURRENT_SOURCE_DIR/cmake/gcc_config.cmake)
endif()

if($CMAKE_SYSTEM_NAME MATCHES "Darwin")
  include($CMAKE_CURRENT_SOURCE_DIR/cmake/darwin.cmake)
elseif($CMAKE_SYSTEM_NAME MATCHES "Linux")
  include($CMAKE_CURRENT_SOURCE_DIR/cmake/linux.cmake)
elseif($CMAKE_SYSTEM_NAME MATCHES "Windows")
  include($CMAKE_CURRENT_SOURCE_DIR/cmake/msvc_config.cmake)
#elseif($CMAKE_SYSTEM_NAME MATCHES "iOS")
#  include($CMAKE_CURRENT_SOURCE_DIR/cmake/ios-arm.cmake)
endif()

if ($TARGET MATCHES "android")
  include($CMAKE_CURRENT_SOURCE_DIR/cmake/android.cmake)
endif()

add_subdirectory(OsnClient/OsnClient)

#if(NOT $CMAKE_SYSTEM_NAME MATCHES "iOS")
  add_subdirectory(OsnClientApp/OsnClientApp)
#endif()

srcs CMakelists.txt:

project(ProjectName)
cmake_minimum_required(VERSION 2.8)

set(OSN_ROOT $CMAKE_CURRENT_SOURCE_DIR)
set(OSN_INCLUDE $OSN_ROOT/../../../include)
set(OSNCLIENT_EXPORTS on)


set(gabro_files $CMAKE_CURRENT_SOURCE_DIR/../../../gabro/$TARGET )
if ($TARGET MATCHES android)
  set(gabro_files $CMAKE_CURRENT_SOURCE_DIR/../../../gabro/$TARGET-$ANDROID_ABI )
endif()


if ($CMAKE_SYSTEM_NAME MATCHES Windows)
  SET(CMAKE_SHARED_LINKER_FLAGS "$CMAKE_SHARED_LINKER_FLAGS
/NODEFAULTLIB:libboost_date_time-vc100-mt-s-1_47.lib
....
....
/VERBOSE:LIB
")
endif()

add_definitions(-DGABRO_WIN32_API_STATIC)

set(src
  $OSN_ROOT/src1.cpp
  $OSN_ROOT/src2.cpp
)

include_directories(
  $CMAKE_CURRENT_SOURCE_DIR
  $OSN_ROOT
  $gabro_files/include
  $OSN_INCLUDE
)

if ($TARGET MATCHES android)
  set(log_lib  $ANDROID_NDK/platforms/android-$ANDROID_NATIVE_API_LEVEL/arch-$ANDROID_ARCH_NAME/usr/lib )
endif()

link_directories(
  $gabro_files/lib
)


set(link_libs gabro_client_api_static)

if (WIN32)
  list(APPEND link_libs gabro_static_external-mt wininet )
elseif ($CMAKE_SYSTEM_NAME MATCHES Darwin)
  list(APPEND link_libs gabro_static_external pthread z dl)
elseif ($TARGET MATCHES android)
  list(APPEND link_libs gabro_static_external libOsnClient.so log)
else()
  list(APPEND link_libs gabro_static_external pthread dl rt)
endif()

if ($CMAKE_SYSTEM_NAME MATCHES "ios")
   add_library($PROJECT_NAME STATIC $src)
else()
   add_library($PROJECT_NAME SHARED $src)
endif()

target_link_libraries($PROJECT_NAME $link_libs )

install(TARGETS $PROJECT_NAME 
  RUNTIME DESTINATION bin
  LIBRARY DESTINATION lib
  ARCHIVE DESTINATION lib
)

clang++ --version:

Android(5220042 基于 r346389c)clang 版本 8.0.7 (https://android.googlesource.com/toolchain/clang b55f2d4ebfd35bf643d27dbca1bb228957008617) (https://android.googlesource.com/toolchain/llvm 3c393fe7a7e13b0fba4ac75a01aa683d7a5b11cd)(基于 LLVM 8.0.7svn) 目标:x86_64-unknown-linux-gnu 线程模型:posix

【问题讨论】:

你能分享失败的编译命令吗(或者更好的是,编译器输出-v)?或者也许是 CMakeLists.txt?看起来包含路径配置不正确,但我无法从给出的信息中判断原因。 @DanAlbert 我已经添加了 CMake 文件和编译器信息 -v,而不是--verbose。将其添加到CMAKE_CXX_FLAGS 【参考方案1】:

确保您没有定义 __GLIBC__。 Android 没有使用 glibc。

来自有问题的文件__locale

class _LIBCPP_TYPE_VIS ctype_base

public:
#if defined(__GLIBC__)  // <-- Here's the problem
    typedef unsigned short mask;
    static const mask space  = _ISspace;
    static const mask print  = _ISprint;
    static const mask cntrl  = _IScntrl;
    static const mask upper  = _ISupper;
...

【讨论】:

以上是关于使用未声明的标识符“_ISspace”的主要内容,如果未能解决你的问题,请参考以下文章

错误:使用未声明的标识符“touchesBegan”

使用未声明的类型“DKAsset”,使用未解析的标识符“DKImagePickerController”?

使用未声明的标识符“top”;您指的是 'pop' 吗?

如何处理`使用未声明的标识符'UIDevice'`

使用声明[关闭]的未声明标识符'k'

在 CoreLocation 中使用未声明的标识符错误