Hello everyone:
Recently I am trying to migrate some third-party open-sourced project in Android,and I already compiled it with NDK toolchain suceessfully.Then I create two some source files for calling the library,here is my Android.bp:
cc_library {
name: "libevsadas",
srcs:[
"utils/EvsLog.cpp",
"adas/AdasManager.cpp",
"adas/AdasMessageReader.cpp",
"adas/proto/*.cc"
],
include_dirs: [
"packages/services/Car/cpp/evs/apps/default/utils/",
"packages/services/Car/cpp/evs/apps/default/adas/",
],
cppflags: [
"-Wall",
"-Werror",
"-Wunused",
"-Wunreachable-code",
"-Wno-unknown-pragmas",
"-Wno-unused-parameter",
"-Wno-non-virtual-dtor",
"-Wno-macro-redefined",
"-Wno-unused-lambda-capture",
"-fexceptions",
"-fPIE",
"-fPIC"
],
shared_libs: [
"libcutils",
"libutils",
"liblog",
"libbase",
"libcyber",
"libfastcdr",
"libfastrtps",
"libc++_shared",
"libads_log",
"libcyber_proto",
"libprotobufcyber",
"libfoonathan_memory-0.7.1"
],
rtti: true
}
these libraries are all third-party libraries compiled with NDK toolchain:
"libcyber",
"libfastcdr",
"libfastrtps",
"libc++_shared",
"libads_log",
"libcyber_proto",
"libprotobufcyber",
"libfoonathan_memory-0.7.1"
I defined these libraries in Android.bp like this:
cc_prebuilt_library_shared {
name: "libcyber",
arch: {
x86: {
srcs: ["libs/x86/libcyber.so"],
},
arm64: {
srcs: ["libs/arm64-v8a/libcyber.so"],
},
},
check_elf_files: false,
}
and my source files are these:
"utils/EvsLog.cpp",
"adas/AdasManager.cpp",
"adas/AdasMessageReader.cpp",
"adas/proto/*.cc"
And my new library should named "libevsadas",the output should be libevsadas.so.
But now I got these errors:
ld.lld: error: undefined symbol: apollo::cyber::Init(char const*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >)
>>> referenced by AdasMessageReader.cpp:84 (packages/services/Car/cpp/evs/apps/default/adas/AdasMessageReader.cpp:84)
>>> out/soong/.intermediates/packages/services/Car/cpp/evs/apps/default/libevsadas/android_x86_static/obj/packages/services/Car/cpp/evs/apps/default/adas/AdasMessageReader.o:(AdasMessageReader::init())
ld.lld: error: undefined symbol: apollo::cyber::CreateNode(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)
>>> referenced by AdasMessageReader.cpp:86 (packages/services/Car/cpp/evs/apps/default/adas/AdasMessageReader.cpp:86)
>>> out/soong/.intermediates/packages/services/Car/cpp/evs/apps/default/libevsadas/android_x86_static/obj/packages/services/Car/cpp/evs/apps/default/adas/AdasMessageReader.o:(AdasMessageReader::init())
ld.lld: error: undefined symbol: autoplt::log::Logger::CreateLogger(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, autoplt::log::LogLevel)
>>> referenced by node.h:441 (packages/services/Car/cpp/evs/apps/default/adas/cyber/node/node.h:441)
>>> out/soong/.intermediates/packages/services/Car/cpp/evs/apps/default/libevsadas/android_x86_static/obj/packages/services/Car/cpp/evs/apps/default/adas/AdasMessageReader.o:(std::__1::shared_ptr<apollo::cyber::Reader<autoplt::canfd::AdasMsg> > apollo::cyber::Node::CreateReader<autoplt::canfd::AdasMsg>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::function<void (std::__1::shared_ptr<autoplt::canfd::AdasMsg> const&)> const&))
>>> referenced by node_channel_impl.h:207 (packages/services/Car/cpp/evs/apps/default/adas/cyber/node/node_channel_impl.h:207)
>>> out/soong/.intermediates/packages/services/Car/cpp/evs/apps/default/libevsadas/android_x86_static/obj/packages/services/Car/cpp/evs/apps/default/adas/AdasMessageReader.o:(std::__1::shared_ptr<apollo::cyber::Reader<autoplt::canfd::AdasMsg> > apollo::cyber::NodeChannelImpl::CreateReader<autoplt::canfd::AdasMsg>(apollo::cyber::proto::RoleAttributes const&, std::__1::function<void (std::__1::shared_ptr<autoplt::canfd::AdasMsg> const&)> const&, unsigned int))
>>> referenced by node_channel_impl.h:223 (packages/services/Car/cpp/evs/apps/default/adas/cyber/node/node_channel_impl.h:223)
>>> out/soong/.intermediates/packages/services/Car/cpp/evs/apps/default/libevsadas/android_x86_static/obj/packages/services/Car/cpp/evs/apps/default/adas/AdasMessageReader.o:(std::__1::shared_ptr<apollo::cyber::Reader<autoplt::canfd::AdasMsg> > apollo::cyber::NodeChannelImpl::CreateReader<autoplt::canfd::AdasMsg>(apollo::cyber::proto::RoleAttributes const&, std::__1::function<void (std::__1::shared_ptr<autoplt::canfd::AdasMsg> const&)> const&, unsigned int))
>>> referenced 19 more times
it seems that when linker link libevsadas.so with other shared libraries,the linker can't the needed symbols.
I have googled some time,the problem maybe the STL,all the third-party libraries are compiled with NDK toochain and use the STL:libc++_shared.so,which has the namespace std::__ndk1 while libc++.so‘s namespace will be std::__1,so linker can't find the right symbol from my prebuilt libraries.
while When I compiled libevsadas.so,the default STL is libc++.so,this may be the problem.
I have tried set stl in Android.bp like this:
stl: "c++_shared",
can somebody give me some advices?