2017-06-16 143 views
0

在从谷歌教程“添加C和C++代码到您的项目”加入预建图书馆

在部分下面的代码片段时的Android NDK的CMake默认的根目录下的“添加其他预建图书馆”

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位于?

+1

'我得到链接错误,说我在做这个假设时找不到共享库中的函数。“ - 这个错误意味着你的共享库没有定义给定的函数。或者你忘了与该库链接(使用'target_link_libraries')。如果链接程序未能找到链接的库,则会发出**其他错误**。 – Tsyvarev

回答

1

根据对IMPORTED_LOCATION财产的文件,应该明确地指定为完整路径

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

如果你想要这个路径是电流源目录下,与${CMAKE_CURRENT_SOURCE_DIR}/前面加上它。


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

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

+0

当前源代码是哪个CMakeLists.txt驻留在。请参阅相关问题 - > https://stackoverflow.com/questions/15662497/in-cmake-what-is-the-difference-between-cmake-current-source- DIR-和cmake的-CURR – bph