在另一个 ndkbuild 库上创建 CMake 本机库



我有两个Android库需要为我的应用程序构建。依赖关系图如下:

Myapp --> ProjectA --> ProjectF

Myapp取决于ProjectA(这是一个库项目(,ProjectA取决于ProjectF(也是一个库项目(。

ProjectAProjectF都包含本机代码。

ProjectA是使用CMake(我写的(构建的,ProjectF是我从Github下载的项目,并使用ndkbuild(包含 Android.mk(。它从命令行构建得很好。我为ProjectF创建了一个build.gradle,以便将其包含在应用程序的Android Studio项目中。这个build.gradle看起来像下面。

apply plugin: 'com.android.library'
apply plugin: 'com.github.dcendents.android-maven'
android {
compileSdkVersion 29
defaultConfig {
minSdkVersion 16
targetSdkVersion 29
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles.add(file("proguard-rules.pro"))
}
}
externalNativeBuild {
ndkBuild {
path 'jni/Android.mk'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
}

我已经在项目结构中设置了如上所述的依赖项。

我的 CMakeLists.txt 文件ProjectA如下所示:

cmake_minimum_required(VERSION 3.4.1)
add_library(
my-native-lib
SHARED
[List of .c/.cpp source files for ProjectA]
)
include_directories(
[list of include directories for ProjectA and API headers from ProjectF]
)
add_library(
ProjectF   #[this is the library which should be linked when building ProjectA]
STATIC
IMPORTED
)
find_library(
log-lib
log )

target_link_libraries(
my-native-lib
${log-lib} )

但是,对于从ProjectF引用的符号,我在构建ProjectA时遇到链接器错误。链接器命令显示ProjectF中的库根本没有链接。

我确定我错过了一些非常愚蠢的东西。我真的很感激任何帮助。

ProjectF目标库未链接,因为它未包含在target_link_libraries()调用中。CMake 不会自动将此库链接到其他库;您必须明确告诉 CMake 要链接哪些库。你可能还需要使用IMPORTED_LOCATION属性告诉 CMake 导入的ProjectF库驻留在计算机上的位置

此外,通常使用PATHS参数调用find_library(),以告诉 CMake 在哪里查找特定库。如果未找到log库,请考虑添加一些搜索路径。

CMake 代码的更新部分可能如下所示:

add_library(
ProjectF   #[this is the library which should be linked when building ProjectA]
STATIC
IMPORTED
)
# Tell CMake where ProjectF library exists.
set_target_properties(ProjectF PROPERTIES
IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/path/to/libs/ProjectFLib.a
)
find_library(
log-lib
PATHS /path/containing/your/log/lib
log )
# Don't forget to link ProjectF here!
target_link_libraries(
my-native-lib PUBLIC
ProjectF
${log-lib} )

相关内容

最新更新