我经过一段时间后回到了Android开发,但我的旧的基于ANT的构建链似乎无法与最新的SDK一起使用(这是一个单独的问题),因此我尝试着采用新的方式进行开发,这种方式基于gradle和CMake。
我的项目需要许多预构建的静态和动态第三方库,但我一直没有成功地将它们链接起来。
据我所知,这些库需要在“'CMakeLists.txt”文件中指定而不是“build.gradle”文件中指定,但我对这两个系统都很陌生,如果我有错误,请纠正我。
以下是我迄今为止尝试过的内容:
first, I try to resolve the location of bullet. I've tried variants where I omit the 'lib' the '.a' and the 'armeabi-v7a' (hoping it'd pick up the right CPU variant) but none have worked
find_library(bullet_lib libBullet.a HINTS ${LIBBASE}bullet3/build3/Android/obj/local/armeabi-v7a)
I'm not sure how this differs from the libraries included in
target_link_libraries
add_library(bullet_lib STATIC IMPORTED)
this finds the built-in libraries fine but I get linker errors for 'bullet' and other 3rd party libs
target_link_libraries(my_project_name android log EGL GLESv2 bullet_lib)
${LIBBASE}
是第三方库的基础目录,看起来似乎没问题,但是还有一个问题:CMake错误似乎不会在Android Studio中显示!我可以通过在包含“CMakeLists.txt”文件的文件夹中运行cmake .
来大致确定它遇到了什么问题,但我不确定是否使用了正确的参数:无论Android Studio如何处理cmake和该文件,对我来说都是一个黑匣子。我在Android Studio中唯一能看到的消息是链接器错误(它没有提到找不到库的CMake错误,这就是这些链接器错误的原因)。
Build command failed.
Error while executing process E:\prog\Android\cmake\3.6.4111459\bin\cmake.exe with arguments {--build E:\prog\anthracite\gradle\AnthracitePlayerAPI21\app\.externalNativeBuild\cmake\debug\x86_64 --target anthracite-lib}
[1/1] Linking CXX shared library ..\..\..\..\build\intermediates\cmake\debug\obj\x86_64\libanthracite-lib.so
FAILED: cmd.exe /C "cd . && E:\prog\Android\ndk-bundle\toolchains\llvm\prebuilt\windows-x86_64\bin\clang++.exe --target=x86_64-none-linux-android --gcc-toolchain=E:/prog/Android/ndk-bundle/toolchains/x86_64-4.9/prebuilt/windows-x86_64 --sysroot=E:/prog/Android/ndk-bundle/sysroot -fPIC -isystem E:/prog/Android/ndk-bundle/sysroot/usr/include/x86_64-linux-android -D__ANDROID_API__=21 -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -Wa,--noexecstack -Wformat -Werror=format-security -std=c++11 -fexceptions -O0 -fno-limit-debug-info -Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libatomic.a --sysroot E:/prog/Android/ndk-bundle/platforms/android-21/arch-x86_64 -Wl,--build-id -Wl,--warn-shared-textrel -Wl,--fatal-warnings -Wl,--no-undefined -Wl,-z,noexecstack -Qunused-arguments -Wl,-z,relro -Wl,-z,now -shared -Wl,-soname,libanthracite-lib.so -o ..\..\..\..\build\intermediates\cmake\debug\obj\x86_64\libanthracite-lib.so @CMakeFiles/anthracite-lib.rsp && cd ."
E:\prog\anthracite\src/CCmpPhysicsScene3D.cpp:237: error: undefined reference to 'btDbvtBroadphase::btDbvtBroadphase(btOverlappingPairCache*)'
E:\prog\anthracite\src/CCmpPhysicsScene3D.cpp:240: error: undefined reference to 'btDefaultCollisionConfiguration::btDefaultCollisionConfiguration(btDefaultCollisionConstructionInfo const&)'
E:\prog\anthracite\src/CCmpPhysicsScene3D.cpp:242: error: undefined reference to 'btCollisionDispatcher::btCollisionDispatcher(btCollisionConfiguration*)'
E:\prog\anthracite\src/CCmpPhysicsScene3D.cpp:243: error: undefined reference to 'btSequentialImpulseConstraintSolver::btSequentialImpulseConstraintSolver()'
E:\prog\anthracite\src/CCmpPhysicsScene3D.cpp:246: error: undefined reference to 'btDefaultSoftBodySolver::btDefaultSoftBodySolver()'
E:\prog\anthracite\src/CCmpPhysicsScene3D.cpp:247: error: undefined reference to 'btSoftRigidDynamicsWorld::btSoftRigidDynamicsWorld(btDispatcher*, btBroadphaseInterface*, btConstraintSolver*, btCollisionConfiguration*, btSoftBodySolver*)'
E:\prog\anthracite\src/CCmpPhysicsScene3D.cpp:250: error: undefined reference to 'btDiscreteDynamicsWorld::btDiscreteDynamicsWorld(btDispatcher*, btBroadphaseInterface*, btConstraintSolver*, btCollisionConfiguration*)'
E:\prog\anthracite\src/CCmpPhysJointHinge.cpp:117: error: undefined reference to 'btHingeConstraint::btHingeConstraint(btRigidBody&, btVector3 const&, btVector3 const&, bool)'
clang++.exe: error: linker command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.
在命令行中运行“cmake。”会得到以下结果:
-- Selecting Windows SDK version 10.0.16299.0 to target Windows 10.0.17133.
CMake Warning at CMakeLists.txt:447 (message):
resolved libraries:
CMake Warning at CMakeLists.txt:448 (message):
e:/prog/libs/bullet3/build3/Android/obj/local/armeabi-v7a
CMake Warning at CMakeLists.txt:449 (message):
bullet_lib-NOTFOUND
-- Configuring done
-- Generating done
-- Build files have been written to: E:/prog/anthracite/gradle/AnthracitePlayerAPI21/app
虽然我上面提到过,但我不确定'cmake'的调用参数是否与Android Studio内部有所不同,因此我对输出结果的真实性持怀疑态度。(例如,它默认为Windows构建,因此我不确定它是否会查找'.lib'库而不是'.a'或'.so'库)
此外,我在我的'CMakeLists.txt'文件中使用以下几行来报告构建状态:
message(WARNING "resolved libraries:")
message(WARNING ${LIBBASE}bullet3/build3/Android/obj/local/armeabi-v7a)
message(WARNING ${bullet_lib})
无论如何,显然我错过了什么,而且我没有找到任何关于这方面的明确指南。这似乎是一件非常简单和明显的事情(链接库),但它似乎是一个巨大的痛苦。 如果有任何指导意见,我将不胜感激。
add_library(bullet_lib STATIC IMPORTED)
后,您需要使用set_target_properties(lib PROPERTIES IMPORTED_LOCATION
添加库文件的位置,并使目标包含头文件。 - Vygintas B