android NDK 中预构建工具链和自定义工具链编译器之间的区别
difference between prebuild tool-chain and custom tool-chain compilers in android NDK
所以我想弄清楚如何为 android 构建 ICU。最初我尝试使用独立的工具链来实现它,经过一些战斗后我至少能够为 x86_64 arch 做到这一点(没有尝试与其他人一起)。但是我不想拥有完全自定义的构建系统,所以我决定弄清楚如何使用预构建工具链来制作它。我发现它的行为非常不同——这很奇怪。所以这是我实际尝试使用独立工具链配置 ICU 时的命令:
icu/source/configure --disable-shared --enable-static --disable-dyload
--disable-extras --disable-tests --disable-samples --prefix=/icu/build --host=x86_64-linux-android --with-cross-build=/toplay/icu/icu_linux CC=/custom_toolchain/bin/clang
CXX=/custom_toolchain/bin/clang++
LD=/custom_toolchain/bin/x86_64-linux-android-ld
AR=/custom_toolchain/bin/x86_64-linux-android-ar
CFLAGS="-fPIC -DANDROID -fdata-sections -ffunction-sections"
CXXFLAGS="-fPIC -DANDROID -frtti -fno-exceptions -fdata-sections
-ffunction-sections"
因此,具有所有相同的命令,但仅更改预构建工具链中的编译器和工具,如下所示:
icu/source/configure --disable-shared --enable-static --disable-dyload
--disable-extras --disable-tests --disable-samples --prefix=/icu/build --host=x86_64-linux-android --with-cross-build=/toplay/icu/icu_linux CC=/ndk-bundle/toolchains/x86_64-4.9/prebuilt/linux-x86_64/bin/clang
CXX=/ndk-bundle/toolchains/x86_64-4.9/prebuilt/linux-x86_64/bin/clang++
LD=/ndk-bundle/toolchains/x86_64-4.9/prebuilt/linux-x86_64/bin/x86_64-linux-android-ld
AR=/ndk-bundle/toolchains/x86_64-4.9/prebuilt/linux-x86_64//bin/x86_64-linux-android-ar
CFLAGS="-fPIC -DANDROID -fdata-sections -ffunction-sections"
CXXFLAGS="-fPIC -DANDROID -frtti -fno-exceptions -fdata-sections
-ffunction-sections"
我得到非常不同的配置步骤结果。我放置了 there: (TLDR: 主要区别:在预构建工具链案例系统中无法理解它是交叉编译的模式,它会找到 nl_langinfo
、strtod_l
,这在 android 中不可用)并且如果独立工具链最初可以构建 ICU,在预构建案例中构建过程最终会中断。
所以我的问题是:编译器和工具在预构建和独立情况下有什么区别,flags/settings我需要添加什么才能使其在预构建情况下工作?
这是预期的行为。我已经在 our bugtracker.
上回答了这个问题
Our Clang defaults to targeting x86 Linux, not any flavor of Android. Setting up your target flags is one of the many things standalone toolchains do.
I'm not really sure what problem you're trying to solve. Whatever you get working with autoconf is going to essentially be a cobbled together standalone toolchain. Standalone toolchains exist entirely for dealing with this kind of scenario.
在这里回答您的具体问题:
what is the difference between compilers and tools in prebuild and standalone case and what flags/settings I need to add to make it work in prebuild case?
独立工具链是具有不同目录布局(因此编译器可以推断出 binutils、sysroot 和 STL 的位置)和一些默认标志(如 Clang 的 -target
)的预构建工具链。如果你要让它工作,你只是重新发明了这个轮子(可能通过使用 -gcc-toolchain
和一堆 --sysroot
、-isystem
、-L
东西而不是改变目录结构。
万一“为什么这不能开箱即用?”是一个跟进问题,请记住,在 Android 中,您有许多架构,甚至更多 OS 的目标版本,以及一些可供选择的 STL。目前,无论是 Clang 还是 GCC 都无法以可以处理所有 Android 变体的方式进行设置(从长远来看,我确实希望改变这一点,但这已经很差了 the road)。
所以我想弄清楚如何为 android 构建 ICU。最初我尝试使用独立的工具链来实现它,经过一些战斗后我至少能够为 x86_64 arch 做到这一点(没有尝试与其他人一起)。但是我不想拥有完全自定义的构建系统,所以我决定弄清楚如何使用预构建工具链来制作它。我发现它的行为非常不同——这很奇怪。所以这是我实际尝试使用独立工具链配置 ICU 时的命令:
icu/source/configure --disable-shared --enable-static --disable-dyload --disable-extras --disable-tests --disable-samples --prefix=/icu/build --host=x86_64-linux-android --with-cross-build=/toplay/icu/icu_linux CC=/custom_toolchain/bin/clang CXX=/custom_toolchain/bin/clang++ LD=/custom_toolchain/bin/x86_64-linux-android-ld AR=/custom_toolchain/bin/x86_64-linux-android-ar CFLAGS="-fPIC -DANDROID -fdata-sections -ffunction-sections" CXXFLAGS="-fPIC -DANDROID -frtti -fno-exceptions -fdata-sections -ffunction-sections"
因此,具有所有相同的命令,但仅更改预构建工具链中的编译器和工具,如下所示:
icu/source/configure --disable-shared --enable-static --disable-dyload --disable-extras --disable-tests --disable-samples --prefix=/icu/build --host=x86_64-linux-android --with-cross-build=/toplay/icu/icu_linux CC=/ndk-bundle/toolchains/x86_64-4.9/prebuilt/linux-x86_64/bin/clang CXX=/ndk-bundle/toolchains/x86_64-4.9/prebuilt/linux-x86_64/bin/clang++ LD=/ndk-bundle/toolchains/x86_64-4.9/prebuilt/linux-x86_64/bin/x86_64-linux-android-ld AR=/ndk-bundle/toolchains/x86_64-4.9/prebuilt/linux-x86_64//bin/x86_64-linux-android-ar CFLAGS="-fPIC -DANDROID -fdata-sections -ffunction-sections" CXXFLAGS="-fPIC -DANDROID -frtti -fno-exceptions -fdata-sections -ffunction-sections"
我得到非常不同的配置步骤结果。我放置了 there: (TLDR: 主要区别:在预构建工具链案例系统中无法理解它是交叉编译的模式,它会找到 nl_langinfo
、strtod_l
,这在 android 中不可用)并且如果独立工具链最初可以构建 ICU,在预构建案例中构建过程最终会中断。
所以我的问题是:编译器和工具在预构建和独立情况下有什么区别,flags/settings我需要添加什么才能使其在预构建情况下工作?
这是预期的行为。我已经在 our bugtracker.
上回答了这个问题Our Clang defaults to targeting x86 Linux, not any flavor of Android. Setting up your target flags is one of the many things standalone toolchains do.
I'm not really sure what problem you're trying to solve. Whatever you get working with autoconf is going to essentially be a cobbled together standalone toolchain. Standalone toolchains exist entirely for dealing with this kind of scenario.
在这里回答您的具体问题:
what is the difference between compilers and tools in prebuild and standalone case and what flags/settings I need to add to make it work in prebuild case?
独立工具链是具有不同目录布局(因此编译器可以推断出 binutils、sysroot 和 STL 的位置)和一些默认标志(如 Clang 的 -target
)的预构建工具链。如果你要让它工作,你只是重新发明了这个轮子(可能通过使用 -gcc-toolchain
和一堆 --sysroot
、-isystem
、-L
东西而不是改变目录结构。
万一“为什么这不能开箱即用?”是一个跟进问题,请记住,在 Android 中,您有许多架构,甚至更多 OS 的目标版本,以及一些可供选择的 STL。目前,无论是 Clang 还是 GCC 都无法以可以处理所有 Android 变体的方式进行设置(从长远来看,我确实希望改变这一点,但这已经很差了 the road)。