In my Android project, I use the JUCE framework and the Projucer to create a static C++ library.
I implemented that library in my project, but I get multiple error like this (full stack below): ld: error: undefined symbol: __strlen_chk
Since I'm not a C++ expert, I really don't know where to investigate, but here is what I did so far:
- my
CMakeLists.txt
file:
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})
- my
app/build.gradle
file (my app is actually a Flutter project):
def localProperties = new Properties()
def localPropertiesFile = rootProject.file('local.properties')
if (localPropertiesFile.exists()) {
localPropertiesFile.withReader('UTF-8') { reader ->
localProperties.load(reader)
}
}
def flutterRoot = localProperties.getProperty('flutter.sdk')
if (flutterRoot == null) {
throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
}
def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
if (flutterVersionCode == null) {
flutterVersionCode = '1'
}
def flutterVersionName = localProperties.getProperty('flutter.versionName')
if (flutterVersionName == null) {
flutterVersionName = '1.0'
}
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
android {
compileSdkVersion flutter.compileSdkVersion
ndkVersion flutter.ndkVersion
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
sourceSets {
main.java.srcDirs += 'src/main/kotlin'
}
defaultConfig {
applicationId "com.juceaudio.juceaudiodemo"
minSdkVersion flutter.minSdkVersion
targetSdkVersion flutter.targetSdkVersion
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName
externalNativeBuild {
cmake {
version = "3.24.1"
abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
arguments "-DANDROID_STL=c++_shared"
cppFlags "-std=c++17"
}
}
}
externalNativeBuild {
cmake {
path 'CMakeLists.txt'
}
}
buildTypes {
release {
// TODO: Add your own signing config for the release build.
signingConfig signingConfigs.debug
}
}
}
flutter {
source '../..'
}
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
}
Here is the full stack of the error:
* 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/645e434e/armeabi-v7a'
[1/1] Linking CXX shared library /Users/mregnauld/ProjetsFlutter/JUCEAudioDemo/juceaudiodemo/build/app/intermediates/cxx/Debug/645e434e/obj/armeabi-v7a/libnative-lib.so
FAILED: /Users/mregnauld/ProjetsFlutter/JUCEAudioDemo/juceaudiodemo/build/app/intermediates/cxx/Debug/645e434e/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 -std=c++17 -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/645e434e/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-12: 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/645e434e/armeabi-v7a \
native-lib
from /Users/mregnauld/ProjetsFlutter/JUCEAudioDemo/juceaudiodemo/android/app
So where this error could come from? Any idea is very welcomed.
Thanks for your help.