我有两个Android库需要为我的应用程序构建。依赖关系图如下:
Myapp --> ProjectA --> ProjectF
Myapp
取决于ProjectA
(这是一个库项目(,ProjectA
取决于ProjectF
(也是一个库项目(。
ProjectA
和ProjectF
都包含本机代码。
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} )