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 )

NDK开发使用cMake方式 - 添加其他的预编译库

如何使用cmake生成基于静态库的动态链接库

CMake c++ 库链接

cmake设置默认静态链接库

CMake:将Fortran与静态C库链接失败