在Google教程“将C和C ++代码添加到您的项目”的以下代码段中

在“添加其他预构建库”部分中

add_library(...)
set_target_properties( # Specifies the target library.
                       imported-lib

                       # Specifies the parameter you want to define.
                       PROPERTIES IMPORTED_LOCATION

                       # Provides the path to the library you want to import.
                       imported-lib/src/${ANDROID_ABI}/libimported-lib.so )


来源:https://developer.android.com/studio/projects/add-native-code.html

imported-lib/src/${ANDROID_ABI}/libimported-lib.so关联的隐式根目录是什么?

我的第一个猜测是它是project/app/,即CMakeLists.txt所在的目录,但是实验表明情况并非如此。我得到链接错误,说我做这个假设时找不到共享库中的函数。

更新:

在Tsyvarev的帮助下,我意识到错误不是来自set_target_properties()而是target_link_libraries()

set_target_properties()似乎使用project/app作为其根

但是target_link_libraries()不会。如果我以project/app作为预构建共享库位置的根,则我的项目构建将失败。如果我指定完整路径,即从/home/me/...etc./etc./mylib.so开始,那么它确实起作用。

在第一个实例中的错误消息是:

/home/me/Android/Sdk/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/bin/ld: error: cannot find -llibs/armeabi-v7a/libmylib.so


也许在这种情况下,根目录是ld所在的目录?

最佳答案

根据IMPORTED_LOCATION属性的文档,应明确将其指定为完整路径:


  导入目标的磁盘上主文件的完整路径。


如果您希望此路径位于当前源目录下,请在其前面加上${CMAKE_CURRENT_SOURCE_DIR}/



指定相对路径只是未定义的行为。

在您的情况下,CMake只是将路径传递给链接器(即,链接器在系统库目录和使用link_directories()命令添加的目录下搜索该链接器)。但是,此行为(未记录)可能会在将来随时更改。

关于android - 添加预建库时,Android NDK Cmake的默认根目录,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44593343/

10-12 00:20
查看更多