【问题标题】:Add a static library (.a file) to an Android project with CMake, get "CMake Error: CMake can not determine linker language for target"使用 CMake 将静态库(.a 文件)添加到 Android 项目,得到“CMake 错误:CMake 无法确定目标的链接器语言”
【发布时间】:2018-10-23 11:22:28
【问题描述】:

我从另一个 Android 项目生成静态库,所以很确定它们是可用的。

我得到了四个基于 CPU 架构的 .a 文件,一个也经过测试的 .h 文件。

现在在新项目中,另一个.c文件要调用静态库,我不能合并两个项目,静态库必须以.a格式调用。

我收到“CMake 错误:CMake 无法确定目标的链接器语言”,这是我的 CMakeLists.txt:

add_library(
    mylib
    STATIC
    src/main/jniLibs/arm64-v8a/libmylib.a
    src/main/jniLibs/armeabi-v7a/libmylib.a
    src/main/jniLibs/x86/libmylib.a
    src/main/jniLibs/x86_64/libmylib.a
)

target_link_libraries(
    native-lib
    mylib
)

mylib 是预构建的库。 native-lib 想调用 mylib。

也欢迎提供有关如何从 scrat 将 .a 文件添加到项目的链接。

【问题讨论】:

标签: c cmake android-ndk linker static-libraries


【解决方案1】:
add_library(
        my_static_lib
        STATIC
        IMPORTED
)
set_target_properties(features PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libmy_static_lib.a)

如你所见,我将那些.a 文件放入

projectNmae\app\src\main\jniLibs\${ANDROID_ABI}\,

如果更改位置,请记得在CMakeList.txt 中声明。

我将my_static_lib.h 放在src\main\include 中,并在其他.c/cpp 文件中使用它,例如:

#include "../include/features.h"

我的最大错误是错过了:

${CMAKE_SOURCE_DIR}

CMake 在src/main/app/native-lib.c 等位置找不到STATIC 库,SHARED 库可以,不是STATIC 库,这很奇怪。

并且IMPORTED是必须的,我尝试用整个位置路径替换它,行不通。

谢谢各位大佬和回答,希望这个回答可以帮助像我这样的新手。

【讨论】:

    【解决方案2】:

    您应该将您现有的 static 库链接到您当前的 shared 库,即.so。例如,您有src/c/dummy.c。那么你的CMakeLists.txt 应该如下所示:

    add_library(my-shared-lib SHARED src/c/dummy.c)
    
    target_link_libraries(my-shared-lib -Wl, --whole-archive src/main/jniLibs/${ANDROID_ABI}/libmylib.a -Wl,--no-whole-archive)
    

    说明

    • ${ANDROID_ABI} 是 CMake 变量,用于标识当前正在构建的 ABI,即 arm64-v8aarm64-v8ax86x86_64

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-26
      • 1970-01-01
      • 1970-01-01
      • 2018-02-06
      • 1970-01-01
      相关资源
      最近更新 更多