Compilation error: undefined symbol: __strlen_chk

In my Android project, I implemented JUCE as a C++ library.

I managed to implement everything, but when I try to compile my app, I get the following error:

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:buildCMakeDebug[armeabi-v7a]'.
> com.android.ide.common.process.ProcessException: ninja: Entering directory `/Users/mregnauld/ProjetsFlutter/JUCEAudioDemo/juceaudiodemo/android/app/.cxx/Debug/5m4z36ud/armeabi-v7a'
  [1/1] Linking CXX shared library /Users/mregnauld/ProjetsFlutter/JUCEAudioDemo/juceaudiodemo/build/app/intermediates/cxx/Debug/5m4z36ud/obj/armeabi-v7a/libnative-lib.so
  FAILED: /Users/mregnauld/ProjetsFlutter/JUCEAudioDemo/juceaudiodemo/build/app/intermediates/cxx/Debug/5m4z36ud/obj/armeabi-v7a/libnative-lib.so 
  : && /Users/mregnauld/AndroidSDK/ndk/23.1.7779620/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=armv7-none-linux-androideabi16 --sysroot=/Users/mregnauld/AndroidSDK/ndk/23.1.7779620/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -fPIC -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -Werror=format-security -fexceptions -frtti -stdlib=libc++ -g  -fno-limit-debug-info -Ofast  -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--fatal-warnings -Qunused-arguments -Wl,--no-undefined -shared -Wl,-soname,libnative-lib.so -o /Users/mregnauld/ProjetsFlutter/JUCEAudioDemo/juceaudiodemo/build/app/intermediates/cxx/Debug/5m4z36ud/obj/armeabi-v7a/libnative-lib.so CMakeFiles/native-lib.dir/src/main/cpp/native-lib.cpp.o CMakeFiles/native-lib.dir/src/main/cpp/PlayAudioEngine.cpp.o  ../../../../src/main/cpp/juceaudio/lib/armeabi-v7a/libjuceaudio.a  libcpufeatures.a  oboe/liboboe.a  /Users/mregnauld/AndroidSDK/ndk/23.1.7779620/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/16/liblog.so  -llog  -lOpenSLES   -latomic -lm && :
  ld: error: undefined symbol: __strlen_chk
  >>> referenced by string.h:227 (/Users/mregnauld/AndroidSDK/ndk/23.1.7779620/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/bits/fortify/string.h:227)
  >>>               include_juce_core.cpp.o:(juce::logAssertion(char const*, int)) in archive ../../../../src/main/cpp/juceaudio/lib/armeabi-v7a/libjuceaudio.a
  >>> referenced by string.h:227 (/Users/mregnauld/AndroidSDK/ndk/23.1.7779620/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/bits/fortify/string.h:227)
  >>>               include_juce_core.cpp.o:(juce::File::getChildFile(juce::StringRef) const) in archive ../../../../src/main/cpp/juceaudio/lib/armeabi-v7a/libjuceaudio.a
  >>> referenced by string.h:227 (/Users/mregnauld/AndroidSDK/ndk/23.1.7779620/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/bits/fortify/string.h:227)
  >>>               include_juce_core.cpp.o:(juce::String::endsWithChar(wchar_t) const) in archive ../../../../src/main/cpp/juceaudio/lib/armeabi-v7a/libjuceaudio.a
  >>> referenced 174 more times

  ld: error: undefined symbol: __open_2
  >>> referenced by fcntl.h:67 (/Users/mregnauld/AndroidSDK/ndk/23.1.7779620/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/bits/fortify/fcntl.h:67)
  >>>               include_juce_core.cpp.o:(juce::MemoryMappedFile::openInternal(juce::File const&, juce::MemoryMappedFile::AccessMode, bool)) in archive ../../../../src/main/cpp/juceaudio/lib/armeabi-v7a/libjuceaudio.a
  >>> referenced by fcntl.h:67 (/Users/mregnauld/AndroidSDK/ndk/23.1.7779620/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/bits/fortify/fcntl.h:67)
  >>>               include_juce_core.cpp.o:(juce::FileInputStream::FileInputStream(juce::File const&)) in archive ../../../../src/main/cpp/juceaudio/lib/armeabi-v7a/libjuceaudio.a
  >>> referenced by fcntl.h:67 (/Users/mregnauld/AndroidSDK/ndk/23.1.7779620/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/bits/fortify/fcntl.h:67)
  >>>               include_juce_core.cpp.o:(juce::FileInputStream::openHandle()) in archive ../../../../src/main/cpp/juceaudio/lib/armeabi-v7a/libjuceaudio.a
  >>> referenced 6 more times

  ld: error: undefined symbol: __read_chk
  >>> referenced by unistd.h:191 (/Users/mregnauld/AndroidSDK/ndk/23.1.7779620/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/bits/fortify/unistd.h:191)
  >>>               include_juce_core.cpp.o:(juce::FileInputStream::readInternal(void*, unsigned int)) in archive ../../../../src/main/cpp/juceaudio/lib/armeabi-v7a/libjuceaudio.a
  >>> referenced by unistd.h:191 (/Users/mregnauld/AndroidSDK/ndk/23.1.7779620/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/bits/fortify/unistd.h:191)
  >>>               include_juce_core.cpp.o:(juce::NamedPipe::Pimpl::read(char*, int, int)) in archive ../../../../src/main/cpp/juceaudio/lib/armeabi-v7a/libjuceaudio.a

  ld: error: undefined symbol: mkfifo
  >>> referenced by juce_posix_NamedPipe.cpp:130 (/Users/mregnauld/JUCE/modules/juce_core/native/juce_posix_NamedPipe.cpp:130)
  >>>               include_juce_core.cpp.o:(juce::NamedPipe::openInternal(juce::String const&, bool, bool)) in archive ../../../../src/main/cpp/juceaudio/lib/armeabi-v7a/libjuceaudio.a
  >>> referenced by juce_posix_NamedPipe.cpp:130 (/Users/mregnauld/JUCE/modules/juce_core/native/juce_posix_NamedPipe.cpp:130)
  >>>               include_juce_core.cpp.o:(juce::NamedPipe::openInternal(juce::String const&, bool, bool)) in archive ../../../../src/main/cpp/juceaudio/lib/armeabi-v7a/libjuceaudio.a

  ld: error: undefined symbol: signal
  >>> referenced by juce_SystemStats.cpp:222 (/Users/mregnauld/JUCE/modules/juce_core/system/juce_SystemStats.cpp:222)
  >>>               include_juce_core.cpp.o:(juce::SystemStats::setApplicationCrashHandler(void (*)(void*))) in archive ../../../../src/main/cpp/juceaudio/lib/armeabi-v7a/libjuceaudio.a
  >>> referenced by juce_SystemStats.cpp:222 (/Users/mregnauld/JUCE/modules/juce_core/system/juce_SystemStats.cpp:222)
  >>>               include_juce_core.cpp.o:(juce::SystemStats::setApplicationCrashHandler(void (*)(void*))) in archive ../../../../src/main/cpp/juceaudio/lib/armeabi-v7a/libjuceaudio.a
  >>> referenced by juce_SystemStats.cpp:222 (/Users/mregnauld/JUCE/modules/juce_core/system/juce_SystemStats.cpp:222)
  >>>               include_juce_core.cpp.o:(juce::SystemStats::setApplicationCrashHandler(void (*)(void*))) in archive ../../../../src/main/cpp/juceaudio/lib/armeabi-v7a/libjuceaudio.a
  >>> referenced 4 more times

  ld: error: undefined symbol: __vsnprintf_chk
  >>> referenced by stdio.h:52 (/Users/mregnauld/AndroidSDK/ndk/23.1.7779620/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/bits/fortify/stdio.h:52)
  >>>               include_juce_core.cpp.o:(juce::String::formattedRaw(char const*, ...)) in archive ../../../../src/main/cpp/juceaudio/lib/armeabi-v7a/libjuceaudio.a

  ld: error: undefined symbol: __memcpy_chk
  >>> referenced by string.h:60 (/Users/mregnauld/AndroidSDK/ndk/23.1.7779620/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/bits/fortify/string.h:60)
  >>>               include_juce_events.cpp.o:(juce::Timer::TimerThread::TimerThread()) in archive ../../../../src/main/cpp/juceaudio/lib/armeabi-v7a/libjuceaudio.a
  clang++: error: linker command failed with exit code 1 (use -v to see invocation)
  ninja: build stopped: subcommand failed.

  C++ build system [build] failed while executing:
      /Users/mregnauld/AndroidSDK/cmake/3.22.1/bin/ninja \
        -C \
        /Users/mregnauld/ProjetsFlutter/JUCEAudioDemo/juceaudiodemo/android/app/.cxx/Debug/5m4z36ud/armeabi-v7a \
        native-lib
    from /Users/mregnauld/ProjetsFlutter/JUCEAudioDemo/juceaudiodemo/android/app

In Android Studio, I updated NDK and CMake, but I still get that error.

And for your information, here is my CMakeLists.txt file (the one of my app):

cmake_minimum_required(VERSION 3.18.1)
project(JUCEAudioDemo)

set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Ofast")

set(CMAKE_CXX_STANDARD 17)

# Oboe
set(OBOE_DIR "${CMAKE_SOURCE_DIR}/../../../../../JUCE/modules/juce_audio_devices/native/oboe")
add_subdirectory(${OBOE_DIR} ./oboe)

# CPU Features
add_library("cpufeatures" STATIC "${ANDROID_NDK}/sources/android/cpufeatures/cpu-features.c")

# JUCE
set(JuceAudio_DIR ${CMAKE_SOURCE_DIR}/src/main/cpp/juceaudio)
add_library(JuceAudio STATIC IMPORTED)
set_property(TARGET JuceAudio PROPERTY IMPORTED_LOCATION
        ${JuceAudio_DIR}/lib/${ANDROID_ABI}/libjuceaudio.a)
set_target_properties(JuceAudio PROPERTIES INTERFACE_INCLUDE_DIRECTORIES
        ${JuceAudio_DIR}/lib/include)
include_directories(${JuceAudio_DIR}/lib/include)
include_directories(${CMAKE_SOURCE_DIR}/../../../../../JUCE/modules)

add_library(
        native-lib

        SHARED

        src/main/cpp/native-lib.cpp
        src/main/cpp/PlayAudioEngine.cpp
        )

find_library(
        log-lib
        log)

target_link_libraries(
        native-lib
        JuceAudio
        "cpufeatures"
        "oboe"
        ${log-lib})

I really don’t know where to start, so any idea is very welcomed!

Thanks.

Hardcode the minSdkVersion to 21 solved the problem.