如何根据目标体系结构将共享库链接到另一个共享库
How to link shared library into another shared library depending on the target architecture?
我想使用 CMake 将 Android 上不同架构的预编译共享库链接到我自己的 jni 共享库。我正在尝试使用target_link_libraries
命令执行此操作。这是我的CMake文件:
cmake_minimum_required(VERSION 3.4.1)
set(CMAKE_C_STANDARD 99)
set (CMAKE_CXX_STANDARD 11)
add_library( # Sets the name of the library.
python-algo-jni
# Sets the library as a shared library.
SHARED
# Provides a relative path to your source file(s).
jni.cpp )
set_target_properties(python-algo-jni PROPERTIES LINKER_LANGUAGE CXX)
target_link_libraries(python-algo-jni libs/${ANDROID_ABI}/libpython3.5m.so)
当我尝试构建时,出现此错误:
Execution failed for task ':calmnessscore:externalNativeBuildDebug'.
> Build command failed.
Error while executing process /Users/mac/Library/Android/sdk/cmake/3.6.4111459/bin/cmake with arguments {--build /Users/mac/Projects/PythonAlgorithmAndroid/calmnessscore/.externalNativeBuild/cmake/debug/x86_64 --target python-algo-jni}
[1/2] Building CXX object CMakeFiles/python-algo-jni.dir/jni.cpp.o
[2/2] Linking CXX shared library /Users/mac/Projects/PythonAlgorithmAndroid/calmnessscore/build/intermediates/cmake/debug/obj/x86_64/libpython-algo-jni.so
FAILED: : && /Users/mac/Library/Android/sdk/ndk-bundle/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=x86_64-none-linux-android --gcc-toolchain=/Users/mac/Library/Android/sdk/ndk-bundle/toolchains/x86_64-4.9/prebuilt/darwin-x86_64 --sysroot=/Users/mac/Library/Android/sdk/ndk-bundle/sysroot -fPIC -isystem /Users/mac/Library/Android/sdk/ndk-bundle/sysroot/usr/include/x86_64-linux-android -D__ANDROID_API__=21 -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -Wa,--noexecstack -Wformat -Werror=format-security -O0 -fno-limit-debug-info -Wl,--exclude-libs,libgcc.a --sysroot /Users/mac/Library/Android/sdk/ndk-bundle/platforms/android-21/arch-x86_64 -Wl,--build-id -Wl,--warn-shared-textrel -Wl,--fatal-warnings -Wl,--no-undefined -Wl,-z,noexecstack -Qunused-arguments -Wl,-z,relro -Wl,-z,now -shared -Wl,-soname,libpython-algo-jni.so -o /Users/mac/Projects/PythonAlgorithmAndroid/calmnessscore/build/intermediates/cmake/debug/obj/x86_64/libpython-algo-jni.so CMakeFiles/python-algo-jni.dir/jni.cpp.o -llibs/x86_64/libpython3.5m.so -lm "/Users/mac/Library/Android/sdk/ndk-bundle/sources/cxx-stl/gnu-libstdc++/4.9/libs/x86_64/libgnustl_static.a" && :
/Users/mac/Library/Android/sdk/ndk-bundle/toolchains/x86_64-4.9/prebuilt/darwin-x86_64/lib/gcc/x86_64-linux-android/4.9.x/../../../../x86_64-linux-android/bin/ld: error: cannot find -llibs/x86_64/libpython3.5m.so
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.
但图书馆肯定在那里。
我找到了解决方案:只需将${CMAKE_CURRENT_SOURCE_DIR}/
添加到lib路径中
target_link_libraries(python-algo-jni ${CMAKE_CURRENT_SOURCE_DIR}/libs/${ANDROID_ABI}/libpython3.5m.so)
相关文章:
- 无法在Ubuntu上将共享库与Eclipse链接
- CMake - 更改共享库链接选项
- 与共享库链接时未定义的引用
- 如何在 Linux 中构建共享库时使未定义引用的链接器失败
- 共享对象、符号、C/C++ 库链接和加载
- 如果同时存在共享库和动态库,则链接器将首选哪个库?
- 如何防止 CMake 在构建时(而不是在安装时)为共享库创建符号链接?
- c++ 链接器错误"针对'.rodata.str1.1'的重新定位R_X86_64_32"链接 CXX 共享库 libsrt.so
- 停止共享库链接丢弃未使用的类
- 链接二进制库或共享库时,为什么必须传入我依赖的共享库?
- 使用共享库编译可执行文件时仅链接所需的符号
- C++ 为什么要级联共享对象链接
- 与 32 位共享对象的链接问题
- 使用 pybind11 构建库,链接其他共享库
- 运行程序时找不到共享对象库,但在编译过程中链接了它
- 链接共享库依赖项未在 ldd 中列出
- 将共享对象与静态库链接
- CMake:修改共享库时的冗余链接
- 与MinGW的静态和动态/共享链接
- Qt-多个QtableWidget可以共享链接的项目