在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
所在的目录,但实验表明情况并非如此。我收到链接错误,说当我做出此假设时找不到共享库中的函数。
更新:
在齐瓦列夫的帮助下,我意识到错误不是来自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()
命令添加的目录下搜索它)。但是,由于未记录,这种行为将来可能随时更改。