交叉编译错误 | '_Float128' 没有命名类型;您的意思是“_Float32x”吗?

问题描述 投票:0回答:2

我在使用 cmake 交叉编译应用程序时遇到问题。我正在使用基于外部 Buildroot 的 SDK 来对其中一个项目进行交叉编译。它是基于“aarch64”的,我还有其他基于“arm”的 SDK,它们编译时没有任何错误。

使用

cmake ../. -DCMAKE_TOOLCHAIN_FILE=[...]/ToolchainFile.cmake
编译成功 它从 C 和 CXX 编译器的 SDK 获取正确的路径。但是当我运行
make
时,我收到以下错误:

In file included from /opt/sdk_mmia53.e2c-demo.640/aarch64-buildroot-linux-gnu/sysroot/usr/include/wchar.h:30,
                 from /opt/sdk_mmia53.e2c-demo.640/opt/ext-toolchain/aarch64-buildroot-linux-gnu/include/c++/9.4.0/cwchar:44,
                 from /opt/sdk_mmia53.e2c-demo.640/opt/ext-toolchain/aarch64-buildroot-linux-gnu/include/c++/9.4.0/bits/postypes.h:40,
                 from /opt/sdk_mmia53.e2c-demo.640/opt/ext-toolchain/aarch64-buildroot-linux-gnu/include/c++/9.4.0/bits/char_traits.h:40,
                 from /opt/sdk_mmia53.e2c-demo.640/opt/ext-toolchain/aarch64-buildroot-linux-gnu/include/c++/9.4.0/string:40,
                 from /root/sources/aarch64/aws-iot-client/lib/aws-iot-device-sdk-cpp/include/Action.hpp:27,
                 from /root/sources/aarch64/aws-iot-client/lib/aws-iot-device-sdk-cpp/src/Action.cpp:26:
/usr/include/x86_64-linux-gnu/bits/floatn.h:87:9: error: '__float128' does not name a type; did you mean '__cfloat128'?
   87 | typedef __float128 _Float128;
      |         ^~~~~~~~~~
      |         __cfloat128
In file included from /opt/sdk_mmia53.e2c-demo.640/opt/ext-toolchain/aarch64-buildroot-linux-gnu/include/c++/9.4.0/cwchar:44,
                 from /opt/sdk_mmia53.e2c-demo.640/opt/ext-toolchain/aarch64-buildroot-linux-gnu/include/c++/9.4.0/bits/postypes.h:40,
                 from /opt/sdk_mmia53.e2c-demo.640/opt/ext-toolchain/aarch64-buildroot-linux-gnu/include/c++/9.4.0/bits/char_traits.h:40,
                 from /opt/sdk_mmia53.e2c-demo.640/opt/ext-toolchain/aarch64-buildroot-linux-gnu/include/c++/9.4.0/string:40,
                 from /root/sources/aarch64/aws-iot-client/lib/aws-iot-device-sdk-cpp/include/Action.hpp:27,
                 from /root/sources/aarch64/aws-iot-client/lib/aws-iot-device-sdk-cpp/src/Action.cpp:26:
/opt/sdk_mmia53.e2c-demo.640/aarch64-buildroot-linux-gnu/sysroot/usr/include/wchar.h:406:8: error: '_Float128' does not name a type; did you mean '_Float32x'?
  406 | extern _Float128 wcstof128 (const wchar_t *__restrict __nptr,
      |        ^~~~~~~~~
      |        _Float32x
/opt/sdk_mmia53.e2c-demo.640/aarch64-buildroot-linux-gnu/sysroot/usr/include/wchar.h:523:8: error: '_Float128' does not name a type; did you mean '_Float32x'?
  523 | extern _Float128 wcstof128_l (const wchar_t *__restrict __nptr,
      |        ^~~~~~~~~
      |        _Float32x
In file included from /opt/sdk_mmia53.e2c-demo.640/opt/ext-toolchain/aarch64-buildroot-linux-gnu/include/c++/9.4.0/cstdlib:75,
                 from /opt/sdk_mmia53.e2c-demo.640/opt/ext-toolchain/aarch64-buildroot-linux-gnu/include/c++/9.4.0/ext/string_conversions.h:41,
                 from /opt/sdk_mmia53.e2c-demo.640/opt/ext-toolchain/aarch64-buildroot-linux-gnu/include/c++/9.4.0/bits/basic_string.h:6496,
                 from /opt/sdk_mmia53.e2c-demo.640/opt/ext-toolchain/aarch64-buildroot-linux-gnu/include/c++/9.4.0/string:55,
                 from /root/sources/aarch64/aws-iot-client/lib/aws-iot-device-sdk-cpp/include/Action.hpp:27,
                 from /root/sources/aarch64/aws-iot-client/lib/aws-iot-device-sdk-cpp/src/Action.cpp:26:
/opt/sdk_mmia53.e2c-demo.640/aarch64-buildroot-linux-gnu/sysroot/usr/include/stdlib.h:152:8: error: '_Float128' does not name a type; did you mean '_Float32x'?
  152 | extern _Float128 strtof128 (const char *__restrict __nptr,
      |        ^~~~~~~~~
      |        _Float32x
/opt/sdk_mmia53.e2c-demo.640/aarch64-buildroot-linux-gnu/sysroot/usr/include/stdlib.h:245:4: error: '_Float128' has not been declared
  245 |    _Float128 __f)
      |    ^~~~~~~~~
/opt/sdk_mmia53.e2c-demo.640/aarch64-buildroot-linux-gnu/sysroot/usr/include/stdlib.h:330:8: error: '_Float128' does not name a type; did you mean '_Float32x'?
  330 | extern _Float128 strtof128_l (const char *__restrict __nptr,
      |        ^~~~~~~~~
      |        _Float32x
In file included from /opt/sdk_mmia53.e2c-demo.640/opt/ext-toolchain/aarch64-buildroot-linux-gnu/include/c++/9.4.0/cstdlib:75,
                 from /opt/sdk_mmia53.e2c-demo.640/opt/ext-toolchain/aarch64-buildroot-linux-gnu/include/c++/9.4.0/ext/string_conversions.h:41,
                 from /opt/sdk_mmia53.e2c-demo.640/opt/ext-toolchain/aarch64-buildroot-linux-gnu/include/c++/9.4.0/bits/basic_string.h:6496,
                 from /opt/sdk_mmia53.e2c-demo.640/opt/ext-toolchain/aarch64-buildroot-linux-gnu/include/c++/9.4.0/string:55,
                 from /root/sources/aarch64/aws-iot-client/lib/aws-iot-device-sdk-cpp/include/Action.hpp:27,
                 from /root/sources/aarch64/aws-iot-client/lib/aws-iot-device-sdk-cpp/src/Action.cpp:26:
/opt/sdk_mmia53.e2c-demo.640/aarch64-buildroot-linux-gnu/sysroot/usr/include/stdlib.h:935:5: error: expected initializer before '__attr_access'
  935 |     __attr_access ((__read_only__, 2));
      |     ^~~~~~~~~~~~~
/opt/sdk_mmia53.e2c-demo.640/aarch64-buildroot-linux-gnu/sysroot/usr/include/stdlib.h:940:3: error: expected initializer before '__attr_access'
  940 |   __attr_access ((__write_only__, 1, 3)) __attr_access ((__read_only__, 2));
      |   ^~~~~~~~~~~~~
/opt/sdk_mmia53.e2c-demo.640/aarch64-buildroot-linux-gnu/sysroot/usr/include/stdlib.h:994:30: error: expected initializer before '__attr_access'
  994 |      __THROW __nonnull ((2)) __attr_access ((__write_only__, 2, 3));
      |                              ^~~~~~~~~~~~~
In file included from /opt/sdk_mmia53.e2c-demo.640/opt/ext-toolchain/aarch64-buildroot-linux-gnu/include/c++/9.4.0/ext/string_conversions.h:41,
                 from /opt/sdk_mmia53.e2c-demo.640/opt/ext-toolchain/aarch64-buildroot-linux-gnu/include/c++/9.4.0/bits/basic_string.h:6496,
                 from /opt/sdk_mmia53.e2c-demo.640/opt/ext-toolchain/aarch64-buildroot-linux-gnu/include/c++/9.4.0/string:55,
                 from /root/sources/aarch64/aws-iot-client/lib/aws-iot-device-sdk-cpp/include/Action.hpp:27,
                 from /root/sources/aarch64/aws-iot-client/lib/aws-iot-device-sdk-cpp/src/Action.cpp:26:
/opt/sdk_mmia53.e2c-demo.640/opt/ext-toolchain/aarch64-buildroot-linux-gnu/include/c++/9.4.0/cstdlib:154:11: error: '::mbstowcs' has not been declared
  154 |   using ::mbstowcs;
      |           ^~~~~~~~
/opt/sdk_mmia53.e2c-demo.640/opt/ext-toolchain/aarch64-buildroot-linux-gnu/include/c++/9.4.0/cstdlib:171:11: error: '::wcstombs' has not been declared
  171 |   using ::wcstombs;
      |           ^~~~~~~~
In file included from /opt/sdk_mmia53.e2c-demo.640/opt/ext-toolchain/aarch64-buildroot-linux-gnu/include/c++/9.4.0/cstdio:42,
                 from /opt/sdk_mmia53.e2c-demo.640/opt/ext-toolchain/aarch64-buildroot-linux-gnu/include/c++/9.4.0/ext/string_conversions.h:43,
                 from /opt/sdk_mmia53.e2c-demo.640/opt/ext-toolchain/aarch64-buildroot-linux-gnu/include/c++/9.4.0/bits/basic_string.h:6496,
                 from /opt/sdk_mmia53.e2c-demo.640/opt/ext-toolchain/aarch64-buildroot-linux-gnu/include/c++/9.4.0/string:55,
                 from /root/sources/aarch64/aws-iot-client/lib/aws-iot-device-sdk-cpp/include/Action.hpp:27,
                 from /root/sources/aarch64/aws-iot-client/lib/aws-iot-device-sdk-cpp/src/Action.cpp:26:
/opt/sdk_mmia53.e2c-demo.640/aarch64-buildroot-linux-gnu/sysroot/usr/include/stdio.h:569:12: error: expected initializer before '__attr_access'
  569 |      __wur __attr_access ((__write_only__, 1, 2));
      |            ^~~~~~~~~~~~~
/opt/sdk_mmia53.e2c-demo.640/aarch64-buildroot-linux-gnu/sysroot/usr/include/stdio.h:593:5: error: expected initializer before '__attr_access'
  593 |     __attr_access ((__write_only__, 1, 2));
      |     ^~~~~~~~~~~~~
In file included from /opt/sdk_mmia53.e2c-demo.640/opt/ext-toolchain/aarch64-buildroot-linux-gnu/include/c++/9.4.0/ext/string_conversions.h:43,
                 from /opt/sdk_mmia53.e2c-demo.640/opt/ext-toolchain/aarch64-buildroot-linux-gnu/include/c++/9.4.0/bits/basic_string.h:6496,
                 from /opt/sdk_mmia53.e2c-demo.640/opt/ext-toolchain/aarch64-buildroot-linux-gnu/include/c++/9.4.0/string:55,
                 from /root/sources/aarch64/aws-iot-client/lib/aws-iot-device-sdk-cpp/include/Action.hpp:27,
                 from /root/sources/aarch64/aws-iot-client/lib/aws-iot-device-sdk-cpp/src/Action.cpp:26:
/opt/sdk_mmia53.e2c-demo.640/opt/ext-toolchain/aarch64-buildroot-linux-gnu/include/c++/9.4.0/cstdio:108:11: error: '::fgets' has not been declared
  108 |   using ::fgets;
      |           ^~~~~
In file included from /root/sources/aarch64/aws-iot-client/lib/aws-iot-device-sdk-cpp/include/Action.hpp:29,
                 from /root/sources/aarch64/aws-iot-client/lib/aws-iot-device-sdk-cpp/src/Action.cpp:26:
/opt/sdk_mmia53.e2c-demo.640/opt/ext-toolchain/aarch64-buildroot-linux-gnu/include/c++/9.4.0/memory: In function 'void* std::align(std::size_t, std::size_t, void*&, std::size_t&)':
/opt/sdk_mmia53.e2c-demo.640/opt/ext-toolchain/aarch64-buildroot-linux-gnu/include/c++/9.4.0/memory:121:58: error: cast from 'void*' to 'uintptr_t' {aka 'unsigned int'} loses precision [-fpermissive]
  121 |   const auto __intptr = reinterpret_cast<uintptr_t>(__ptr);
      |                                                          ^
make[2]: *** [lib/aws-iot-device-sdk-cpp/CMakeFiles/aws-iot-sdk-cpp.dir/build.make:66: lib/aws-iot-device-sdk-cpp/CMakeFiles/aws-iot-sdk-cpp.dir/src/Action.cpp.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:341: lib/aws-iot-device-sdk-cpp/CMakeFiles/aws-iot-sdk-cpp.dir/all] Error 2
make: *** [Makefile:133: all] Error 2

我不明白这个错误的原因是什么,而它为“arm”SDK 构建成功。

ToolchainFile.cmake
# General CMAKE cross compile settings
SET(CMAKE_SYSTEM_NAME Linux)
SET(CMAKE_SYSTEM_PROCESSOR arm)
SET(CMAKE_SYSTEM_VERSION 1)

# Specify Sysroot path
SET(CMAKE_SYSROOT /opt/sdk_mmia53.e2c-demo.640/aarch64-buildroot-linux-gnu/sysroot/)

# Specify path to find filesystem items
SET(CMAKE_FIND_ROOT_PATH /opt/sdk_mmia53.e2c-demo.640/aarch64-buildroot-linux-gnu/sysroot/)

# Search for programs in the build host directories
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)

# Search for libraries and headers in the target directories
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)

# Specify toolchain directory
SET(TOOLCHAIN_DIR /opt/sdk_mmia53.e2c-demo.640/bin/)

# Specify cross compilation target
SET(TARGET_CROSS aarch64-linux-)

# Set compilers
SET(CMAKE_CXX_COMPILER ${TOOLCHAIN_DIR}/${TARGET_CROSS}g++)

# Set linker
SET(CMAKE_LINKER ${TOOLCHAIN_DIR}/${TARGET_CROSS}ld)

# Set compiler flags
SET(CMAKE_CXX_FLAGS ${COMMON_FLAGS} -std=c++11)

# Set archiving tool
SET(CMAKE_AR ${TOOLCHAIN_DIR}/${TARGET_CROSS}ar CACHE FILEPATH "Archiver")

# Set randomizing tool for static libraries
SET(CMAKE_RANLIB ${TOOLCHAIN_DIR}/${TARGET_CROSS}ranlib)

# Set strip tool
SET(CMAKE_STRIP ${TOOLCHAIN_DIR}/${TARGET_CROSS}strip)

# Set objdump tool
SET(CMAKE_OBJDUMP ${TOOLCHAIN_DIR}/${TARGET_CROSS}objdump)

# Set objcopy tool
SET(CMAKE_OBJCOPY ${TOOLCHAIN_DIR}/${TARGET_CROSS}objcopy)

# Set nm tool
SET(CMAKE_NM ${TOOLCHAIN_DIR}/${TARGET_CROSS}nm)

# Set THREADS_PTHREAD_ARG for testing threading
SET(THREADS_PTHREAD_ARG "2" CACHE STRING "Forcibly set by ToolchainFile.cmake." FORCE)

CMakeCache.txt
中,所有路径均从 SDK 获取,而不从构建系统获取任何内容

有人可以告诉我如何解决这个问题吗?

我们将非常感谢您的帮助。

提前致谢

P.S:我使用的是 Ubuntu 20.04。如果此处缺少任何信息,请告诉我。

cmake cross-compiling arm64
2个回答
0
投票

x86_64-linux-gnu
是您不希望在 aarch64 构建中看到的东西,但您却使用了
x86_64-linux-gnu/bits/floatn.h

您需要弄清楚它是如何潜入的。您的 SDK 到底在哪里突破其目录并使用非 SDK 标头?


0
投票

@Preeti 因为我还不能发表评论,所以我将其发布为“答案”。你有没有解决这个问题?请发布您的解决方案,因为我现在也遇到了这个问题

© www.soinside.com 2019 - 2024. All rights reserved.