Why can't I importing GLib built for Android in my CMakeLists.txt project?

Im using such script to build GLib:

❯ cat cross_file_android_arm64_31.txt
[constants]
ndk_path = '/home/ethan/Android/sdk/ndk/ndk'
toolchain = ndk_path / 'toolchains/llvm/prebuilt/linux-x86_64'

[host_machine]
system = 'android'
cpu_family = 'aarch64'
cpu = 'aarch64'
endian = 'little'

[properties]
sys_root = toolchain / 'sysroot'
c_ld = 'gold'
cpp_ld = 'gold'

[binaries]
c =     toolchain / 'bin/aarch64-linux-android31-clang'
cpp =   toolchain / 'bin/aarch64-linux-android31-clang++'
ar =    toolchain / 'bin/llvm-ar'
strip = toolchain / 'bin/llvm-strip'

❯ cat build-android-arm64.sh
GLIB_SRC_DIR="glib-2.78.1"
CROSS_FILE=".gitlab-ci/cross_file_android_arm64_31.txt"
BUILD_DIR="build-release-android-arm64-static"
INSTALL_PREFIX="/mnt/ethan-drive-ntfs/Work/Work/Projects/glib/install"

FULL_INSTALL_PATH="${INSTALL_PREFIX}/${BUILD_DIR}"

cd $GLIB_SRC_DIR
mkdir $BUILD_DIR
meson $BUILD_DIR --default-library=static --cross-file $CROSS_FILE --prefix=$FULL_INSTALL_PATH

meson compile -C $BUILD_DIR
meson install -C $BUILD_DIR

Which build success.

then I use this prebuild lib in my CMake project:

cmake_minimum_required(VERSION 3.18.1)

set(CMAKE_C_STANDARD 11)
set(CMAKE_SYSTEM_NAME Android)
set(ANDROID_NDK /home/ethan/Android/sdk/ndk/ndk)
set(CMAKE_ANDROID_ARCH_ABI arm64-v8a)
set(CMAKE_TOOLCHAIN_FILE /home/ethan/Android/sdk/ndk/ndk/build/cmake/android.toolchain.cmake)
set(ANDROID_ABI arm64-v8a)
project(l1)

#file(GLOB_RECURSE l1_source_DIR CONFIGURE_DEPENDS src/*.c include/*.h)
file(GLOB_RECURSE l1_source_DIR CONFIGURE_DEPENDS src/test.c include/*.h)

add_executable(l1 ${l1_source_DIR})

set(GLib_dir ${CMAKE_SOURCE_DIR}/../../install/build-release-android-arm64-static)
set(GLib_libdir ${GLib_dir}/lib)
set(GLib_glib ${GLib_libdir}/libglib-2.0.a)
set(GLib_gobject ${GLib_libdir}/libgobject-2.0.a)
set(GLib_intl ${GLib_libdir}/libintl.a)
set(GLib_pcre ${GLib_libdir}/libpcre2-8.a ${GLib_libdir}/libpcre2-posix.a ${GLib_libdir}/libpcre2-16.a ${GLib_libdir}/libpcre2-32.a)

set(GLIB_INCLUDE_DIRS 
    ${GLib_dir}/include/glib-2.0
    ${GLib_libdir}/glib-2.0/include
)

set(L1_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/include)
    
target_include_directories(l1 
    PUBLIC ${GLIB_INCLUDE_DIRS}
    PUBLIC ${L1_INCLUDE_DIRS})

target_link_libraries(
    l1
    #${ANDROID_NDK}/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/libc.a
    ${GLib_pcre}
    ${GLib_intl}
    ${GLib_glib}
    ${GLib_gobject})

and got errors:

[main] Building folder: l1 
[build] Starting build
[proc] Executing command: /usr/sbin/cmake --build /mnt/ethan-drive-ntfs/Work/Work/Projects/glib/learn-glib/l1/build --config Debug --target all --
[build] [1/2   0% :: 0.009] Re-checking globbed directories...
[build] [1/1 100% :: 0.365] Linking C executable l1
[build] FAILED: l1 
[build] : && /home/ethan/Android/sdk/ndk/ndk/toolchains/llvm/prebuilt/linux-x86_64/bin/clang --target=aarch64-none-linux-android21 --sysroot=/home/ethan/Android/sdk/ndk/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security  -fno-limit-debug-info -static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments CMakeFiles/l1.dir/src/test.c.o -o l1  /mnt/ethan-drive-ntfs/Work/Work/Projects/glib/learn-glib/l1/../../install/build-release-android-arm64-static/lib/libpcre2-8.a  /mnt/ethan-drive-ntfs/Work/Work/Projects/glib/learn-glib/l1/../../install/build-release-android-arm64-static/lib/libpcre2-posix.a  /mnt/ethan-drive-ntfs/Work/Work/Projects/glib/learn-glib/l1/../../install/build-release-android-arm64-static/lib/libpcre2-16.a  /mnt/ethan-drive-ntfs/Work/Work/Projects/glib/learn-glib/l1/../../install/build-release-android-arm64-static/lib/libpcre2-32.a  /mnt/ethan-drive-ntfs/Work/Work/Projects/glib/learn-glib/l1/../../install/build-release-android-arm64-static/lib/libintl.a  /mnt/ethan-drive-ntfs/Work/Work/Projects/glib/learn-glib/l1/../../install/build-release-android-arm64-static/lib/libglib-2.0.a  /mnt/ethan-drive-ntfs/Work/Work/Projects/glib/learn-glib/l1/../../install/build-release-android-arm64-static/lib/libgobject-2.0.a  -latomic -lm && :
[build] ld.lld: error: undefined symbol: stderr
[build] >>> referenced by gthread-posix.c:86 (../glib/gthread-posix.c:86)
[build] >>>               gthread-posix.c.o:(g_thread_abort) in archive /mnt/ethan-drive-ntfs/Work/Work/Projects/glib/learn-glib/l1/../../install/build-release-android-arm64-static/lib/libglib-2.0.a
[build] >>> referenced by gthread-posix.c:86 (../glib/gthread-posix.c:86)
[build] >>>               gthread-posix.c.o:(g_thread_abort) in archive /mnt/ethan-drive-ntfs/Work/Work/Projects/glib/learn-glib/l1/../../install/build-release-android-arm64-static/lib/libglib-2.0.a
[build] >>> referenced by gthread-posix.c:1449 (../glib/gthread-posix.c:1449)
[build] >>>               gthread-posix.c.o:(g_system_thread_free) in archive /mnt/ethan-drive-ntfs/Work/Work/Projects/glib/learn-glib/l1/../../install/build-release-android-arm64-static/lib/libglib-2.0.a
[build] >>> referenced 23 more times
[build] 
[build] ld.lld: error: undefined symbol: pthread_attr_setinheritsched
[build] >>> referenced by gthread-posix.c:1294 (../glib/gthread-posix.c:1294)
[build] >>>               gthread-posix.c.o:(g_system_thread_new) in archive /mnt/ethan-drive-ntfs/Work/Work/Projects/glib/learn-glib/l1/../../install/build-release-android-arm64-static/lib/libglib-2.0.a
[build] 
[build] ld.lld: error: undefined symbol: posix_spawnattr_init
[build] >>> referenced by gspawn.c:2095 (../glib/gspawn.c:2095)
[build] >>>               gspawn.c.o:(fork_exec) in archive /mnt/ethan-drive-ntfs/Work/Work/Projects/glib/learn-glib/l1/../../install/build-release-android-arm64-static/lib/libglib-2.0.a
[build] 
[build] ld.lld: error: undefined symbol: posix_spawnattr_setflags
[build] >>> referenced by gspawn.c:2107 (../glib/gspawn.c:2107)
[build] >>>               gspawn.c.o:(fork_exec) in archive /mnt/ethan-drive-ntfs/Work/Work/Projects/glib/learn-glib/l1/../../install/build-release-android-arm64-static/lib/libglib-2.0.a
[build] 
[build] ld.lld: error: undefined symbol: posix_spawnattr_setsigdefault
[build] >>> referenced by gspawn.c:2118 (../glib/gspawn.c:2118)
[build] >>>               gspawn.c.o:(fork_exec) in archive /mnt/ethan-drive-ntfs/Work/Work/Projects/glib/learn-glib/l1/../../install/build-release-android-arm64-static/lib/libglib-2.0.a
[build] 
[build] ld.lld: error: undefined symbol: posix_spawn_file_actions_init
[build] >>> referenced by gspawn.c:2122 (../glib/gspawn.c:2122)
[build] >>>               gspawn.c.o:(fork_exec) in archive /mnt/ethan-drive-ntfs/Work/Work/Projects/glib/learn-glib/l1/../../install/build-release-android-arm64-static/lib/libglib-2.0.a
[build] 
[build] ld.lld: error: undefined symbol: posix_spawnattr_destroy
[build] >>> referenced by gspawn.c:2286 (../glib/gspawn.c:2286)
[build] >>>               gspawn.c.o:(fork_exec) in archive /mnt/ethan-drive-ntfs/Work/Work/Projects/glib/learn-glib/l1/../../install/build-release-android-arm64-static/lib/libglib-2.0.a
[build] 
[build] ld.lld: error: undefined symbol: posix_spawn_file_actions_adddup2
[build] >>> referenced by gspawn.c:2130 (../glib/gspawn.c:2130)
[build] >>>               gspawn.c.o:(fork_exec) in archive /mnt/ethan-drive-ntfs/Work/Work/Projects/glib/learn-glib/l1/../../install/build-release-android-arm64-static/lib/libglib-2.0.a
[build] >>> referenced by gspawn.c:2148 (../glib/gspawn.c:2148)
[build] >>>               gspawn.c.o:(fork_exec) in archive /mnt/ethan-drive-ntfs/Work/Work/Projects/glib/learn-glib/l1/../../install/build-release-android-arm64-static/lib/libglib-2.0.a
[build] >>> referenced by gspawn.c:2155 (../glib/gspawn.c:2155)
[build] >>>               gspawn.c.o:(fork_exec) in archive /mnt/ethan-drive-ntfs/Work/Work/Projects/glib/learn-glib/l1/../../install/build-release-android-arm64-static/lib/libglib-2.0.a
[build] >>> referenced 4 more times
[build] 
[build] ld.lld: error: undefined symbol: posix_spawn_file_actions_addclose
[build] >>> referenced by gspawn.c:2254 (../glib/gspawn.c:2254)
[build] >>>               gspawn.c.o:(fork_exec) in archive /mnt/ethan-drive-ntfs/Work/Work/Projects/glib/learn-glib/l1/../../install/build-release-android-arm64-static/lib/libglib-2.0.a
[build] 
[build] ld.lld: error: undefined symbol: posix_spawn
[build] >>> referenced by gspawn.c:2266 (../glib/gspawn.c:2266)
[build] >>>               gspawn.c.o:(fork_exec) in archive /mnt/ethan-drive-ntfs/Work/Work/Projects/glib/learn-glib/l1/../../install/build-release-android-arm64-static/lib/libglib-2.0.a
[build] 
[build] ld.lld: error: undefined symbol: posix_spawnp
[build] >>> referenced by gspawn.c:2268 (../glib/gspawn.c:2268)
[build] >>>               gspawn.c.o:(fork_exec) in archive /mnt/ethan-drive-ntfs/Work/Work/Projects/glib/learn-glib/l1/../../install/build-release-android-arm64-static/lib/libglib-2.0.a
[build] 
[build] ld.lld: error: undefined symbol: posix_spawn_file_actions_destroy
[build] >>> referenced by gspawn.c:2284 (../glib/gspawn.c:2284)
[build] >>>               gspawn.c.o:(fork_exec) in archive /mnt/ethan-drive-ntfs/Work/Work/Projects/glib/learn-glib/l1/../../install/build-release-android-arm64-static/lib/libglib-2.0.a
[build] 
[build] ld.lld: error: undefined symbol: stdout
[build] >>> referenced by printf.c:83 (../glib/gnulib/printf.c:83)
[build] >>>               printf.c.o:(_g_gnulib_printf) in archive /mnt/ethan-drive-ntfs/Work/Work/Projects/glib/learn-glib/l1/../../install/build-release-android-arm64-static/lib/libglib-2.0.a
[build] >>> referenced by printf.c:83 (../glib/gnulib/printf.c:83)
[build] >>>               printf.c.o:(_g_gnulib_printf) in archive /mnt/ethan-drive-ntfs/Work/Work/Projects/glib/learn-glib/l1/../../install/build-release-android-arm64-static/lib/libglib-2.0.a
[build] >>> referenced by printf.c:83 (../glib/gnulib/printf.c:83)
[build] >>>               printf.c.o:(_g_gnulib_vprintf) in archive /mnt/ethan-drive-ntfs/Work/Work/Projects/glib/learn-glib/l1/../../install/build-release-android-arm64-static/lib/libglib-2.0.a
[build] >>> referenced 11 more times
[build] 
[build] ld.lld: error: undefined symbol: nl_langinfo
[build] >>> referenced by localcharset.c:289 (../glib/libcharset/localcharset.c:289)
[build] >>>               localcharset.c.o:(_g_locale_charset_raw) in archive /mnt/ethan-drive-ntfs/Work/Work/Projects/glib/learn-glib/l1/../../install/build-release-android-arm64-static/lib/libglib-2.0.a
[build] >>> referenced by gcharset.c:290 (../glib/gcharset.c:290)
[build] >>>               gcharset.c.o:(_g_get_ctype_charset) in archive /mnt/ethan-drive-ntfs/Work/Work/Projects/glib/learn-glib/l1/../../install/build-release-android-arm64-static/lib/libglib-2.0.a
[build] 
[build] ld.lld: error: undefined symbol: iconv_open
[build] >>> referenced by gconvert.c:171 (../glib/gconvert.c:171)
[build] >>>               gconvert.c.o:(g_iconv_open) in archive /mnt/ethan-drive-ntfs/Work/Work/Projects/glib/learn-glib/l1/../../install/build-release-android-arm64-static/lib/libglib-2.0.a
[build] >>> referenced by gconvert.c:171 (../glib/gconvert.c:171)
[build] >>>               gconvert.c.o:(g_iconv_open) in archive /mnt/ethan-drive-ntfs/Work/Work/Projects/glib/learn-glib/l1/../../install/build-release-android-arm64-static/lib/libglib-2.0.a
[build] >>> referenced by gconvert.c:171 (../glib/gconvert.c:171)
[build] >>>               gconvert.c.o:(g_iconv_open) in archive /mnt/ethan-drive-ntfs/Work/Work/Projects/glib/learn-glib/l1/../../install/build-release-android-arm64-static/lib/libglib-2.0.a
[build] >>> referenced 1 more times
[build] 
[build] ld.lld: error: undefined symbol: iconv
[build] >>> referenced by gconvert.c:281 (../glib/gconvert.c:281)
[build] >>>               gconvert.c.o:(g_iconv) in archive /mnt/ethan-drive-ntfs/Work/Work/Projects/glib/learn-glib/l1/../../install/build-release-android-arm64-static/lib/libglib-2.0.a
[build] >>> referenced by gconvert.c:0 (../glib/gconvert.c:0)
[build] >>>               gconvert.c.o:(g_convert_with_iconv) in archive /mnt/ethan-drive-ntfs/Work/Work/Projects/glib/learn-glib/l1/../../install/build-release-android-arm64-static/lib/libglib-2.0.a
[build] >>> referenced by gconvert.c:0 (../glib/gconvert.c:0)
[build] >>>               gconvert.c.o:(g_convert_with_iconv) in archive /mnt/ethan-drive-ntfs/Work/Work/Projects/glib/learn-glib/l1/../../install/build-release-android-arm64-static/lib/libglib-2.0.a
[build] >>> referenced 1 more times
[build] 
[build] ld.lld: error: undefined symbol: iconv_close
[build] >>> referenced by gconvert.c:304 (../glib/gconvert.c:304)
[build] >>>               gconvert.c.o:(g_iconv_close) in archive /mnt/ethan-drive-ntfs/Work/Work/Projects/glib/learn-glib/l1/../../install/build-release-android-arm64-static/lib/libglib-2.0.a
[build] >>> referenced by gconvert.c:304 (../glib/gconvert.c:304)
[build] >>>               gconvert.c.o:(g_convert) in archive /mnt/ethan-drive-ntfs/Work/Work/Projects/glib/learn-glib/l1/../../install/build-release-android-arm64-static/lib/libglib-2.0.a
[build] >>> referenced by gconvert.c:304 (../glib/gconvert.c:304)
[build] >>>               gconvert.c.o:(g_convert_with_fallback) in archive /mnt/ethan-drive-ntfs/Work/Work/Projects/glib/learn-glib/l1/../../install/build-release-android-arm64-static/lib/libglib-2.0.a
[build] >>> referenced 4 more times
[build] 
[build] ld.lld: error: undefined symbol: strtod_l
[build] >>> referenced by gstrfuncs.c:739 (../glib/gstrfuncs.c:739)
[build] >>>               gstrfuncs.c.o:(g_strtod) in archive /mnt/ethan-drive-ntfs/Work/Work/Projects/glib/learn-glib/l1/../../install/build-release-android-arm64-static/lib/libglib-2.0.a
[build] >>> referenced by gstrfuncs.c:739 (../glib/gstrfuncs.c:739)
[build] >>>               gstrfuncs.c.o:(g_ascii_strtod) in archive /mnt/ethan-drive-ntfs/Work/Work/Projects/glib/learn-glib/l1/../../install/build-release-android-arm64-static/lib/libglib-2.0.a
[build] 
[build] ld.lld: error: undefined symbol: __gnu_strerror_r
[build] >>> referenced by gstrfuncs.c:1349 (../glib/gstrfuncs.c:1349)
[build] >>>               gstrfuncs.c.o:(g_strerror) in archive /mnt/ethan-drive-ntfs/Work/Work/Projects/glib/learn-glib/l1/../../install/build-release-android-arm64-static/lib/libglib-2.0.a
[build] clang: error: linker command failed with exit code 1 (use -v to see invocation)
[build] ninja: build stopped: subcommand failed.
[proc] The command: /usr/sbin/cmake --build /mnt/ethan-drive-ntfs/Work/Work/Projects/glib/learn-glib/l1/build --config Debug --target all -- exited with code: 1
[driver] Build completed: 00:00:00.439
[build] Build finished with exit code 1

it try to use static libc.a, which I don’t want. It expected to use libc.so.

when i import libc.a manually: ${ANDROID_NDK}/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/libc.a, it build success, but failed to run:

mido:/data/local/tmp # ./l1
error: "./l1": executable's TLS segment is underaligned: alignment is 8, needs to be at least 64 for ARM64 Bionic
Aborted
mido:/data/local/tmp # ldd /data/local/tmp/l1
        linux-vdso.so.1 => [vdso] (0x78e30c9000)
error: "linker64": executable's TLS segment is underaligned: alignment is 8, needs to be at least 64 for ARM64 Bionic
Aborted

where did I wrong?

Anyway, I found a workaround. The result is that glib build by meson can’t find the android rpath, so all you have to do is tell it where it is.

add_link_options("LINKER:-rpath-link,${ANDROID_NDK}/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android")

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.