阅读静态库的格式以了解如何在 MacOS 上导入它

发布于 2025-01-20 17:24:17 字数 5644 浏览 1 评论 0原文

我有一个使用NDK运行一些本机代码的大库。 使用新版本,我需要用静态库替换从源代码构建的库,这些库被作为一组预制的.a库提供。

我已经配置了该项目来导入这样的库:

cmake_minimum_required (VERSION 3.10)

set(CMAKE_CXX_STANDARD 14)

add_definitions(-DNO_USE_SPLICE)
# Provide build env vars for http.c now that we are using shared jitter_client repo
add_definitions(-Wdeprecated-declarations -DVERSION="android" -DREVISION="1" -DPROGRAMNAME="sksdk" -DBUILDLINK="android" -DBUILDTIME="built_at_TODO")
add_definitions(-D_Exit=exit)

add_definitions(-D__UAPI_DEF_IF_IFNAMSIZ=1)

include_directories(../../external/cpp
        ../../external/cpp/libcompany/src
        src/main/cpp)

add_library( # Specifies the name of the library.
        mynativelib

        # Sets the library as a shared library.
        SHARED

        # Provides a relative path to your source file(s).
        src/main/cpp/cpp_to_jobj/common_convert_cpp_to_jobj.cpp
        src/main/cpp/cpp_to_jobj/thread_utils.cpp
        src/main/cpp/cpp_to_jobj/utf8_scrubber.cpp
        src/main/cpp/jni_utils.cpp
        src/main/cpp/logging_utils.cpp
        src/main/cpp/android_remote_logging.c

        src/main/cpp/executor.cpp)

add_library(curl STATIC IMPORTED)
set_target_properties(curl
        PROPERTIES IMPORTED_LOCATION
        ${CMAKE_SOURCE_DIR}/libs/curl/${ANDROID_ABI}/libcurl.so)

target_compile_definitions(
        mynativelib
        PRIVATE
        ANDROID
)

target_link_libraries(
        mynativelib
        curl
        ${CMAKE_SOURCE_DIR}/libs/static/${ANDROID_ABI}/libmystaticlib.a
        ... other libs here. These are fine ...
)

当我构建库时,我会收到错误:

../../../../ libs/static/static/arm64-v8a/libmystaticlib.a:错误添加符号:未识别的文件格式 clang ++:错误:Linker命令因出口代码1失败(使用-v查看调用)

此处的相关部分:

Caused by: Build command failed.
Error while executing process /Users/rrr/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja with arguments {-C /Users/rrr/myproject/p12345/p12345-android-sdk/sdk/p12345module/.cxx/cmake/release/arm64-v8a mynativelib}
ninja: Entering directory `/Users/rrr/myproject/p12345/p12345-android-sdk/sdk/p12345module/.cxx/cmake/release/arm64-v8a'
[1/1] Linking CXX shared library ../../../../build/intermediates/cmake/release/obj/arm64-v8a/libmynativelib.so
FAILED: ../../../../build/intermediates/cmake/release/obj/arm64-v8a/libmynativelib.so 
: && /Users/rrr/Library/Android/sdk/ndk/21.1.6352462/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=aarch64-none-linux-android21 --gcc-toolchain=/Users/rrr/Library/Android/sdk/ndk/21.1.6352462/toolchains/llvm/prebuilt/darwin-x86_64 --sysroot=/Users/rrr/Library/Android/sdk/ndk/21.1.6352462/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -fPIC -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security   -O2 -DNDEBUG  -Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libgcc_real.a -Wl,--exclude-libs,libatomic.a -static-libstdc++ -Wl,--build-id -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments -shared -Wl,-soname,libmynativelib.so -o ../../../../build/intermediates/cmake/release/obj/arm64-v8a/libmynativelib.so CMakeFiles/mynativelib.dir/src/main/cpp/cpp_to_jobj/common_convert_cpp_to_jobj.cpp.o CMakeFiles/mynativelib.dir/src/main/cpp/cpp_to_jobj/thread_utils.cpp.o CMakeFiles/mynativelib.dir/src/main/cpp/cpp_to_jobj/utf8_scrubber.cpp.o CMakeFiles/mynativelib.dir/src/main/cpp/jni_utils.cpp.o CMakeFiles/mynativelib.dir/src/main/cpp/logging_utils.cpp.o CMakeFiles/mynativelib.dir/src/main/cpp/android_remote_logging.c.o CMakeFiles/mynativelib.dir/src/main/cpp/test_executor.cpp.o -L/Users/rrr/myproject/p12345/p12345-android-sdk/sdk/p12345module/libs/routerAgent/shared/arm64-v8a ../../../../libs/curl/arm64-v8a/libcurl.so ../../../../libs/routerAgent/static/arm64-v8a/libmystaticlib.a -lavformat -lavcodec -lavutil -ljansson ../../../../libs/routerAgent/static/arm64-v8a/libabctytt_wrapper.a ../../../../libs/routerAgent/static/arm64-v8a/libp12345_logging.a ../../../../libs/routerAgent/static/arm64-v8a/libabctytt.a ../../../../libs/routerAgent/static/arm64-v8a/libabcwebfetcher.a ../../../../libs/routerAgent/static/arm64-v8a/libabctargetconfig_core.a ../../../../libs/routerAgent/static/arm64-v8a/libabctargetconfig_config_parsing.a ../../../../libs/routerAgent/static/arm64-v8a/libabctargetconfig_common.a ../../../../libs/routerAgent/static/arm64-v8a/libp12345_latency.a ../../../../libs/routerAgent/static/arm64-v8a/libabc_sk.a ../../../../libs/routerAgent/static/arm64-v8a/libp12345_http.a ../../../../libs/routerAgent/static/arm64-v8a/libp12345_thread.a -latomic -lm && :
../../../../libs/routerAgent/static/arm64-v8a/libmystaticlib.a: error adding symbols: File format not recognized
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.

请注意,我不确定我使用的CMAKE版本是否与一个用于构建库。

我正在使用NDK:21.1.6352462

来研究我尝试了一些人们在类似问题中建议的工具。

使用AR我会收到一个错误:

ar -x libmystaticlib.a 
ar: /: Is a directory
ar: adaptive.c.o/: No such file or directory
ar: coro.c.o/: No such file or directory
ar: curlops.c.o/: No such file or directory
ar: entities.c.o/: No such file or directory
ar: exception.c.o/: No such file or directory
ar: getinfo.c.o/: No such file or directory
ar: helper.c.o/: No such file or directory
ar: metrics.c.o/: No such file or directory
ar: mm_parser.c.o/: No such file or directory

我还尝试了fileobjdump ,两者都不返回任何信息。

有没有办法知道出了什么问题?

I have a big library that uses the NDK to run some native code.
With the new version I need to replace a library that was build from the source code with static libraries that are provided as a set of prebuilt .a libraries.

I have configured the project to import these libraries like this:

cmake_minimum_required (VERSION 3.10)

set(CMAKE_CXX_STANDARD 14)

add_definitions(-DNO_USE_SPLICE)
# Provide build env vars for http.c now that we are using shared jitter_client repo
add_definitions(-Wdeprecated-declarations -DVERSION="android" -DREVISION="1" -DPROGRAMNAME="sksdk" -DBUILDLINK="android" -DBUILDTIME="built_at_TODO")
add_definitions(-D_Exit=exit)

add_definitions(-D__UAPI_DEF_IF_IFNAMSIZ=1)

include_directories(../../external/cpp
        ../../external/cpp/libcompany/src
        src/main/cpp)

add_library( # Specifies the name of the library.
        mynativelib

        # Sets the library as a shared library.
        SHARED

        # Provides a relative path to your source file(s).
        src/main/cpp/cpp_to_jobj/common_convert_cpp_to_jobj.cpp
        src/main/cpp/cpp_to_jobj/thread_utils.cpp
        src/main/cpp/cpp_to_jobj/utf8_scrubber.cpp
        src/main/cpp/jni_utils.cpp
        src/main/cpp/logging_utils.cpp
        src/main/cpp/android_remote_logging.c

        src/main/cpp/executor.cpp)

add_library(curl STATIC IMPORTED)
set_target_properties(curl
        PROPERTIES IMPORTED_LOCATION
        ${CMAKE_SOURCE_DIR}/libs/curl/${ANDROID_ABI}/libcurl.so)

target_compile_definitions(
        mynativelib
        PRIVATE
        ANDROID
)

target_link_libraries(
        mynativelib
        curl
        ${CMAKE_SOURCE_DIR}/libs/static/${ANDROID_ABI}/libmystaticlib.a
        ... other libs here. These are fine ...
)

When I build the library I get the error:

../../../../libs/static/arm64-v8a/libmystaticlib.a: error adding symbols: File format not recognized
clang++: error: linker command failed with exit code 1 (use -v to see invocation)

Here the relevant part of the stacktrace:

Caused by: Build command failed.
Error while executing process /Users/rrr/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja with arguments {-C /Users/rrr/myproject/p12345/p12345-android-sdk/sdk/p12345module/.cxx/cmake/release/arm64-v8a mynativelib}
ninja: Entering directory `/Users/rrr/myproject/p12345/p12345-android-sdk/sdk/p12345module/.cxx/cmake/release/arm64-v8a'
[1/1] Linking CXX shared library ../../../../build/intermediates/cmake/release/obj/arm64-v8a/libmynativelib.so
FAILED: ../../../../build/intermediates/cmake/release/obj/arm64-v8a/libmynativelib.so 
: && /Users/rrr/Library/Android/sdk/ndk/21.1.6352462/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=aarch64-none-linux-android21 --gcc-toolchain=/Users/rrr/Library/Android/sdk/ndk/21.1.6352462/toolchains/llvm/prebuilt/darwin-x86_64 --sysroot=/Users/rrr/Library/Android/sdk/ndk/21.1.6352462/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -fPIC -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security   -O2 -DNDEBUG  -Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libgcc_real.a -Wl,--exclude-libs,libatomic.a -static-libstdc++ -Wl,--build-id -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments -shared -Wl,-soname,libmynativelib.so -o ../../../../build/intermediates/cmake/release/obj/arm64-v8a/libmynativelib.so CMakeFiles/mynativelib.dir/src/main/cpp/cpp_to_jobj/common_convert_cpp_to_jobj.cpp.o CMakeFiles/mynativelib.dir/src/main/cpp/cpp_to_jobj/thread_utils.cpp.o CMakeFiles/mynativelib.dir/src/main/cpp/cpp_to_jobj/utf8_scrubber.cpp.o CMakeFiles/mynativelib.dir/src/main/cpp/jni_utils.cpp.o CMakeFiles/mynativelib.dir/src/main/cpp/logging_utils.cpp.o CMakeFiles/mynativelib.dir/src/main/cpp/android_remote_logging.c.o CMakeFiles/mynativelib.dir/src/main/cpp/test_executor.cpp.o -L/Users/rrr/myproject/p12345/p12345-android-sdk/sdk/p12345module/libs/routerAgent/shared/arm64-v8a ../../../../libs/curl/arm64-v8a/libcurl.so ../../../../libs/routerAgent/static/arm64-v8a/libmystaticlib.a -lavformat -lavcodec -lavutil -ljansson ../../../../libs/routerAgent/static/arm64-v8a/libabctytt_wrapper.a ../../../../libs/routerAgent/static/arm64-v8a/libp12345_logging.a ../../../../libs/routerAgent/static/arm64-v8a/libabctytt.a ../../../../libs/routerAgent/static/arm64-v8a/libabcwebfetcher.a ../../../../libs/routerAgent/static/arm64-v8a/libabctargetconfig_core.a ../../../../libs/routerAgent/static/arm64-v8a/libabctargetconfig_config_parsing.a ../../../../libs/routerAgent/static/arm64-v8a/libabctargetconfig_common.a ../../../../libs/routerAgent/static/arm64-v8a/libp12345_latency.a ../../../../libs/routerAgent/static/arm64-v8a/libabc_sk.a ../../../../libs/routerAgent/static/arm64-v8a/libp12345_http.a ../../../../libs/routerAgent/static/arm64-v8a/libp12345_thread.a -latomic -lm && :
../../../../libs/routerAgent/static/arm64-v8a/libmystaticlib.a: error adding symbols: File format not recognized
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.

Please notice that I'm not sure whether the version of cmake that I'm using is the same as the one used to build the libraries.

I'm using the the NDK: 21.1.6352462

To investigate the issue I tried some tools that people suggested in similar questions.

With ar I get an error:

ar -x libmystaticlib.a 
ar: /: Is a directory
ar: adaptive.c.o/: No such file or directory
ar: coro.c.o/: No such file or directory
ar: curlops.c.o/: No such file or directory
ar: entities.c.o/: No such file or directory
ar: exception.c.o/: No such file or directory
ar: getinfo.c.o/: No such file or directory
ar: helper.c.o/: No such file or directory
ar: metrics.c.o/: No such file or directory
ar: mm_parser.c.o/: No such file or directory

I have also tried with file and objdump that both do not return any information.

Is there a way to know what goes wrong?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文