NDK 与 cmake 的链接库
Posted
技术标签:
【中文标题】NDK 与 cmake 的链接库【英文标题】:NDK linking library with cmake 【发布时间】:2018-08-27 19:55:19 【问题描述】:我有一个执行 opengl (es 2.0) 渲染的 c++ 库,我想在 android 上使用它。将库与target_link_libraries(mylib log GLESv2)
链接时,我收到以下错误:
ld: error: cannot open crtbegin_so.o: No such file or directory
ld: error: cannot open crtend_so.o: No such file or directory
ld: error: cannot find -llog
ld: error: cannot find -lGLESv2
ld: error: cannot find -lm
ld: error: cannot find -lstdc++
ld: error: cannot find -lm
ld: error: cannot find -ldl
ld: error: cannot find -lc
ld: error: cannot find -ldl
如果我从 android ndk 手动提供一个特定目录,它就可以工作。在 cmake 中,这看起来类似于:
link_directories( $ANDROID_NDK/platforms/$ANDROID_API/arch-$ANDROID_ABI/usr/lib )
我想知道这是否是解决错误的正确方法。 在这个简单的example 中,不需要额外定义link_directories。我的图书馆有什么不同?
【问题讨论】:
很奇怪。几乎就好像它没有使用正确的编译器工具一样。你是使用gradle构建还是直接使用cmake/make? 如果你使用的是Android Gradle Plugin + CMake externalNativeBuild ... ,应该不会出现这样的路径错误问题。因为gradle+cmake工具链会寻找正确的链接目录路径$ANDROID_NDK/platforms/$ANDROID_API/arch-$ANDROID_ABI/usr/lib
。
我正在使用Android Studio进行编译。也许我的 cmake 文件中的某些内容正在覆盖 Android 提供的内容?如何查看 android 提供了哪些链接目录?
如果有帮助,请使用详细模式set(CMAKE_VERBOSE_MAKEFILE on)
。需要使用include_directories
设置代码路径。分享你的 CMake
【参考方案1】:
造成这种情况的原因很简单。我正在覆盖我的 cmake 文件中的编译器标志:
SET(CMAKE_CXX_FLAGS "-foo" )
当我把它改成
SET(CMAKE_CXX_FLAGS "$CMAKE_CXX_FLAGS -foo" )
链接问题消失了。
【讨论】:
以上是关于NDK 与 cmake 的链接库的主要内容,如果未能解决你的问题,请参考以下文章
Android NDK 开发CMake 中查找链接 Android 自带动态库位置说明 ( ndk-bundleplatformsandroid-29arch-armusrlib )