使用CMake将静态库(.a文件)添加到Android项目中,获取“ CMake错误:CMake无法确定目标的链接器语言”

时间:2018-10-23 11:22:28

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

我从另一个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。

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

2 个答案:

答案 0 :(得分:1)

您应该将现有的静态库链接到当前的共享库,即.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

答案 1 :(得分:0)

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"

我的 BIGGEST 错误是错过的:

${CMAKE_SOURCE_DIR}

CMake无法在src/main/app/native-lib.c之类的位置找到 STATIC 库, SHARED 库可以,而不是 STATIC 库,这非常好

导入是必须的,我尝试将其替换为整个位置路径,将无法正常工作。

感谢所有评论和答案,我希望这个答案可以帮助像我这样的新手。