conan: Android doesn't need -stdlib=libc++

To help us debug your issue please explain:

  • I’ve read the CONTRIBUTING guide.
  • I’ve specified the Conan version, operating system version and any tool that can be relevant.
  • I’ve explained the steps to reproduce the error or the motivation/use case of the question/suggestion.

conan version 1.2.3, Ubuntu 18.04

related to #2049 #2402 also https://github.com/bincrafters/community/issues/189

there is a problem with conan automatically appending -stdlib=libc++ flag in case of Android cross-compilation with standalone toolchain. as stdlib=libc++ implies -lc++, it fails, because NDK only has libc++_shared.so and libc++_static.so, but neither libc++.a nor libc++.so.

I’ve created a package which demonstrates the error: https://github.com/bincrafters/conan-android_ndk_installer in order to reproduce errors, need to add two standard lines into the test_package/CMakeLists.txt:

include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
conan_basic_setup()

given the simple profile:

cat ~/.conan/profiles/android
[settings]
compiler=clang
compiler.version=5.0
compiler.libcxx=libc++
os=Android
os.api_level=21
os_build=Linux
arch=armv7
arch_build=x86_64
build_type=Debug

and running conan create . bincrafters/testing -p android

the following error appears:

/home/sse4/.conan/data/android_ndk_installer/r16b/bincrafters/testing/package/c03b64d50f54d253f88b5131dcccc04c72bc920d/bin/clang++ --target=armv7-none-linux-androideabi --gcc-toolchain=/home/sse4/.conan/data/android_ndk_installer/r16b/bincrafters/testing/package/c03b64d50f54d253f88b5131dcccc04c72bc920d --sysroot=/home/sse4/.conan/data/android_ndk_installer/r16b/bincrafters/testing/package/c03b64d50f54d253f88b5131dcccc04c72bc920d/sysroot   -I/home/sse4/.conan/data/android_ndk_installer/r16b/bincrafters/stable/package/ea4709a9bf32cba9b08ba74646bc157c4c17305b/include -I/home/sse4/.conan/data/android_ndk_installer/r16b/bincrafters/testing/package/c03b64d50f54d253f88b5131dcccc04c72bc920d/include  -march=armv7-a -mthumb -mfpu=vfpv3-d16 -mfloat-abi=softfp -funwind-tables -no-canonical-prefixes   -stdlib=libc++ -g  -fPIE   -o CMakeFiles/test_package.dir/test_package.cpp.o -c /home/sse4/conan/conan-android_ndk_installer/test_package/test_package.cpp
/home/sse4/conan/conan-android_ndk_installer/test_package/test_package.cpp:1:10: fatal error: 'cstdlib' file not found
#include <cstdlib>
         ^~~~~~~~~
1 error generated.

that may be solved by explicitly adding necessary directory to the includes:

def package_info(self)
...
 self.cpp_info.includedirs.append(os.path.join(self.package_folder, 'include', 'c++', '4.9.x'))

however, linker error will appear next:

/home/sse4/.conan/data/android_ndk_installer/r16b/bincrafters/testing/package/c03b64d50f54d253f88b5131dcccc04c72bc920d/bin/clang++ --target=armv7-none-linux-androideabi --gcc-toolchain=/home/sse4/.conan/data/android_ndk_installer/r16b/bincrafters/testing/package/c03b64d50f54d253f88b5131dcccc04c72bc920d --sysroot=/home/sse4/.conan/data/android_ndk_installer/r16b/bincrafters/testing/package/c03b64d50f54d253f88b5131dcccc04c72bc920d/sysroot  -march=armv7-a -mthumb -mfpu=vfpv3-d16 -mfloat-abi=softfp -funwind-tables -no-canonical-prefixes   -stdlib=libc++ -g   -Wl,--fix-cortex-a8  -fPIE -pie -Wl,--gc-sections -Wl,-z,nocopyreloc     CMakeFiles/test_package.dir/test_package.cpp.o  -o bin/test_package  -L/home/sse4/.conan/data/android_ndk_installer/r16b/bincrafters/stable/package/ea4709a9bf32cba9b08ba74646bc157c4c17305b/lib  -L/home/sse4/.conan/data/android_ndk_installer/r16b/bincrafters/testing/package/c03b64d50f54d253f88b5131dcccc04c72bc920d/lib
/home/sse4/.conan/data/android_ndk_installer/r16b/bincrafters/testing/package/c03b64d50f54d253f88b5131dcccc04c72bc920d/lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/bin/ld: error: cannot find -lc++
/home/sse4/conan/conan-android_ndk_installer/test_package/test_package.cpp:0: error: undefined reference to 'std::__ndk1::cout'
/home/sse4/.conan/data/android_ndk_installer/r16b/bincrafters/testing/package/c03b64d50f54d253f88b5131dcccc04c72bc920d/include/c++/4.9.x/ios:756: error: undefined reference to 'std::__ndk1::ios_base::getloc() const'
/home/sse4/.conan/data/android_ndk_installer/r16b/bincrafters/testing/package/c03b64d50f54d253f88b5131dcccc04c72bc920d/include/c++/4.9.x/__locale:212: error: undefined reference to 'std::__ndk1::locale::use_facet(std::__ndk1::locale::id&) const'
/home/sse4/.conan/data/android_ndk_installer/r16b/bincrafters/testing/package/c03b64d50f54d253f88b5131dcccc04c72bc920d/include/c++/4.9.x/ios:756: error: undefined reference to 'std::__ndk1::locale::~locale()'
/home/sse4/.conan/data/android_ndk_installer/r16b/bincrafters/testing/package/c03b64d50f54d253f88b5131dcccc04c72bc920d/include/c++/4.9.x/ios:756: error: undefined reference to 'std::__ndk1::locale::~locale()'
/home/sse4/.conan/data/android_ndk_installer/r16b/bincrafters/testing/package/c03b64d50f54d253f88b5131dcccc04c72bc920d/include/c++/4.9.x/ios:529: error: undefined reference to 'std::__ndk1::ios_base::clear(unsigned int)'
/home/sse4/.conan/data/android_ndk_installer/r16b/bincrafters/testing/package/c03b64d50f54d253f88b5131dcccc04c72bc920d/include/c++/4.9.x/ostream:736: error: undefined reference to '__cxa_begin_catch'
/home/sse4/.conan/data/android_ndk_installer/r16b/bincrafters/testing/package/c03b64d50f54d253f88b5131dcccc04c72bc920d/include/c++/4.9.x/ostream:739: error: undefined reference to 'std::__ndk1::ios_base::__set_badbit_and_consider_rethrow()'
/home/sse4/.conan/data/android_ndk_installer/r16b/bincrafters/testing/package/c03b64d50f54d253f88b5131dcccc04c72bc920d/include/c++/4.9.x/ostream:740: error: undefined reference to '__cxa_end_catch'
/home/sse4/.conan/data/android_ndk_installer/r16b/bincrafters/testing/package/c03b64d50f54d253f88b5131dcccc04c72bc920d/include/c++/4.9.x/ostream:740: error: undefined reference to '__cxa_end_catch'
/home/sse4/.conan/data/android_ndk_installer/r16b/bincrafters/testing/package/c03b64d50f54d253f88b5131dcccc04c72bc920d/include/c++/4.9.x/ostream:0: error: undefined reference to 'std::__ndk1::ctype<char>::id'
CMakeFiles/test_package.dir/test_package.cpp.o(.ARM.extab.text._ZNSt6__ndk124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_j+0x0): error: undefined reference to '__gxx_personality_v0'
CMakeFiles/test_package.dir/test_package.cpp.o(.ARM.extab.text._ZNSt6__ndk116__pad_and_outputIcNS_11char_traitsIcEEEENS_19ostreambuf_iteratorIT_T0_EES6_PKS4_S8_S8_RNS_8ios_baseES4_+0x0): error: undefined reference to '__gxx_personality_v0'
/home/sse4/.conan/data/android_ndk_installer/r16b/bincrafters/testing/package/c03b64d50f54d253f88b5131dcccc04c72bc920d/include/c++/4.9.x/ostream:274: error: undefined reference to 'std::uncaught_exception()'
/home/sse4/.conan/data/android_ndk_installer/r16b/bincrafters/testing/package/c03b64d50f54d253f88b5131dcccc04c72bc920d/include/c++/4.9.x/ios:529: error: undefined reference to 'std::__ndk1::ios_base::clear(unsigned int)'
/home/sse4/.conan/data/android_ndk_installer/r16b/bincrafters/testing/package/c03b64d50f54d253f88b5131dcccc04c72bc920d/include/c++/4.9.x/ostream:283: error: undefined reference to '__cxa_begin_catch'
/home/sse4/.conan/data/android_ndk_installer/r16b/bincrafters/testing/package/c03b64d50f54d253f88b5131dcccc04c72bc920d/include/c++/4.9.x/ostream:286: error: undefined reference to '__cxa_end_catch'
CMakeFiles/test_package.dir/test_package.cpp.o(.ARM.extab.text._ZNSt6__ndk113basic_ostreamIcNS_11char_traitsIcEEE6sentryD2Ev+0x0): error: undefined reference to '__gxx_personality_v0'
CMakeFiles/test_package.dir/test_package.cpp.o:/home/sse4/conan/conan-android_ndk_installer/test_package/test_package.cpp:function __clang_call_terminate: error: undefined reference to '__cxa_begin_catch'
CMakeFiles/test_package.dir/test_package.cpp.o:/home/sse4/conan/conan-android_ndk_installer/test_package/test_package.cpp:function __clang_call_terminate: error: undefined reference to 'std::terminate()'
/home/sse4/.conan/data/android_ndk_installer/r16b/bincrafters/testing/package/c03b64d50f54d253f88b5131dcccc04c72bc920d/include/c++/4.9.x/ios:529: error: undefined reference to 'std::__ndk1::ios_base::clear(unsigned int)'
/home/sse4/.conan/data/android_ndk_installer/r16b/bincrafters/testing/package/c03b64d50f54d253f88b5131dcccc04c72bc920d/include/c++/4.9.x/ostream:952: error: undefined reference to '__cxa_begin_catch'
/home/sse4/.conan/data/android_ndk_installer/r16b/bincrafters/testing/package/c03b64d50f54d253f88b5131dcccc04c72bc920d/include/c++/4.9.x/ostream:955: error: undefined reference to 'std::__ndk1::ios_base::__set_badbit_and_consider_rethrow()'
/home/sse4/.conan/data/android_ndk_installer/r16b/bincrafters/testing/package/c03b64d50f54d253f88b5131dcccc04c72bc920d/include/c++/4.9.x/ostream:956: error: undefined reference to '__cxa_end_catch'
CMakeFiles/test_package.dir/test_package.cpp.o(.ARM.extab.text._ZNSt6__ndk113basic_ostreamIcNS_11char_traitsIcEEE5flushEv+0x0): error: undefined reference to '__gxx_personality_v0'
/home/sse4/.conan/data/android_ndk_installer/r16b/bincrafters/testing/package/c03b64d50f54d253f88b5131dcccc04c72bc920d/include/c++/4.9.x/new:234: error: undefined reference to 'operator delete(void*)'
/home/sse4/.conan/data/android_ndk_installer/r16b/bincrafters/testing/package/c03b64d50f54d253f88b5131dcccc04c72bc920d/include/c++/4.9.x/new:226: error: undefined reference to 'operator new(unsigned int)'
/home/sse4/.conan/data/android_ndk_installer/r16b/bincrafters/testing/package/c03b64d50f54d253f88b5131dcccc04c72bc920d/include/c++/4.9.x/stdexcept:225: error: undefined reference to '__cxa_allocate_exception'
/home/sse4/.conan/data/android_ndk_installer/r16b/bincrafters/testing/package/c03b64d50f54d253f88b5131dcccc04c72bc920d/include/c++/4.9.x/stdexcept:136: error: undefined reference to 'std::logic_error::logic_error(char const*)'
/home/sse4/.conan/data/android_ndk_installer/r16b/bincrafters/testing/package/c03b64d50f54d253f88b5131dcccc04c72bc920d/include/c++/4.9.x/stdexcept:225: error: undefined reference to '__cxa_throw'
/home/sse4/.conan/data/android_ndk_installer/r16b/bincrafters/testing/package/c03b64d50f54d253f88b5131dcccc04c72bc920d/include/c++/4.9.x/stdexcept:225: error: undefined reference to '__cxa_free_exception'
/home/sse4/.conan/data/android_ndk_installer/r16b/bincrafters/testing/package/c03b64d50f54d253f88b5131dcccc04c72bc920d/include/c++/4.9.x/stdexcept:0: error: undefined reference to 'vtable for std::length_error'
/home/sse4/.conan/data/android_ndk_installer/r16b/bincrafters/testing/package/c03b64d50f54d253f88b5131dcccc04c72bc920d/lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/bin/ld: the vtable symbol may be undefined because the class is missing its key function
/home/sse4/.conan/data/android_ndk_installer/r16b/bincrafters/testing/package/c03b64d50f54d253f88b5131dcccc04c72bc920d/include/c++/4.9.x/stdexcept:0: error: undefined reference to 'typeinfo for std::length_error'
/home/sse4/.conan/data/android_ndk_installer/r16b/bincrafters/testing/package/c03b64d50f54d253f88b5131dcccc04c72bc920d/include/c++/4.9.x/stdexcept:0: error: undefined reference to 'std::length_error::~length_error()'
clang50++: error: linker command failed with exit code 1 (use -v to see invocation)

it’s because it cannot find -lc++, which barely doesn’t exist at all. commenting two lines in test_package/CMakeLists.txt results in no errors and no need for explicit directories. as many existing recipes are using conan_basic_setup, and also flag is added to AutoToolsBuildEnvironment and probably other things as well, I guess it’s not a sane default for Android.

official recommendation on std lib options doesn’t mention -stdlib=libc++: https://developer.android.com/ndk/guides/standalone_toolchain https://developer.android.com/ndk/guides/cpp-support (as it also doesn’t need explicit include/lib directories)

/cc @theodelrieu

About this issue

  • Original URL
  • State: closed
  • Created 6 years ago
  • Comments: 18 (15 by maintainers)

Most upvoted comments

@raffienficiaud The workaround would be to do

if self.settings.os == "Android":
    cmake.definitions["CONAN_LIBCXX"] = ""

before calling cmake.configure(). But we need a proper fix.

Only libc++ will be available in the next NDK release. What I went with (thanks to @memsharded) was adding None to possible libcxx values in my settings.yml.

With this, I don’t have to remove the setting explicitly in every recipe.