android - ndk r20 ld:ld:错误:找不到-lpthread
问题描述
我正在尝试使用 vcpkg 和 ndk r20 为 android arm 构建 tesseract 我不得不编辑 CMakeLists.txt 并添加 glob.c 和 glob.h 因为它们不在 ndk
我还让 fileio.cpp 包含 glob.h
然后我不得不绕过 pkg-config 因为 ndk 没有它我替换它:
if(NOT EXISTS ${PROJECT_SOURCE_DIR}/.cppan)
if (NOT Leptonica_DIR AND NOT MSVC)
find_package(PkgConfig REQUIRED)
pkg_check_modules(Leptonica REQUIRED lept>=${MINIMUM_LEPTONICA_VERSION})
#link_directories(${Leptonica_LIBRARY_DIRS})
else()
find_package(Leptonica ${MINIMUM_LEPTONICA_VERSION} REQUIRED CONFIG)
endif()
else()
if (STATIC)
set(CPPAN_BUILD_SHARED_LIBS 0)
else()
set(CPPAN_BUILD_SHARED_LIBS 1)
endif()
add_subdirectory(.cppan)
endif()
有了这个 :
if(NOT EXISTS ${PROJECT_SOURCE_DIR}/.cppan)
if (NOT Leptonica_DIR AND NOT MSVC)
find_package(Leptonica CONFIG REQUIRED)
#link_libraries(tesseract leptonica) causes errors , tried tesseractlib instead of tesseract
else()
find_package(Leptonica ${MINIMUM_LEPTONICA_VERSION} REQUIRED CONFIG)
endif()
else()
if (STATIC)
set(CPPAN_BUILD_SHARED_LIBS 0)
else()
set(CPPAN_BUILD_SHARED_LIBS 1)
endif()
add_subdirectory(.cppan)
endif()
在此之后,我尝试使用以下命令构建库:
vcpkg install tesseract[core]:arm-android
构建过程由于接近尾声的错误而退出 libtesseract.a 库已构建,但二进制 tesseract 未构建
install-arm-android-rel-out.log 中有很长的日志,这是最后的错误:
[240/242] cmd.exe /C "cd . && E:\programs\vcpkg\downloads\tools\cmake-3.14.0-windows\cmake-3.14.0-win32-x86\bin\cmake.exe -E remove libtesseract.a && E:\programs\ndk\android-ndk-r20\toolchains\llvm\prebuilt\windows-x86_64\bin\arm-linux-androideabi-ar.exe qc libtesseract.a @CMakeFiles\libtesseract.rsp && E:\programs\ndk\android-ndk-r20\toolchains\llvm\prebuilt\windows-x86_64\bin\arm-linux-androideabi-ranlib.exe libtesseract.a && cd ."
[241/242] cmd.exe /C "cd . && E:\programs\ndk\android-ndk-r20\toolchains\llvm\prebuilt\windows-x86_64\bin\clang++.exe --target=armv7-none-linux-androideabi21 --gcc-toolchain=E:/programs/ndk/android-ndk-r20/toolchains/llvm/prebuilt/windows-x86_64 --sysroot=E:/programs/ndk/android-ndk-r20/toolchains/llvm/prebuilt/windows-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -fno-addrsig -march=armv7-a -mthumb -Wa,--noexecstack -Wformat -Werror=format-security -frtti -fexceptions --std=c++11 -Oz -DNDEBUG -Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libatomic.a -static-libstdc++ -Wl,--build-id -Wl,--warn-shared-textrel -Wl,--fatal-warnings -Wl,--exclude-libs,libunwind.a -Wl,--no-undefined -Qunused-arguments -Wl,-z,noexecstack -Wl,--gc-sections CMakeFiles/tesseract.dir/src/api/tesseractmain.cpp.o -o bin\tesseract libtesseract.a -lpthread E:/programs/vcpkg/installed/arm-android/lib/libleptonica.a E:/programs/vcpkg/installed/arm-android/lib/libgif.a E:/programs/vcpkg/installed/arm-android/lib/libjpeg.a E:/programs/vcpkg/installed/arm-android/share/png/../../lib/libpng16.a E:/programs/vcpkg/installed/arm-android/lib/libtiff.a E:/programs/vcpkg/installed/arm-android/lib/liblzma.a E:/programs/vcpkg/installed/arm-android/lib/libjpeg.a E:/programs/vcpkg/installed/arm-android/share/png/../../lib/libpng16.a E:/programs/vcpkg/installed/arm-android/lib/libtiff.a E:/programs/vcpkg/installed/arm-android/lib/liblzma.a E:/programs/vcpkg/installed/arm-android/lib/libz.a -lm E:/programs/vcpkg/installed/arm-android/lib/libz.a -lm -latomic -lm && cd ."
FAILED: bin/tesseract
cmd.exe /C "cd . && E:\programs\ndk\android-ndk-r20\toolchains\llvm\prebuilt\windows-x86_64\bin\clang++.exe --target=armv7-none-linux-androideabi21 --gcc-toolchain=E:/programs/ndk/android-ndk-r20/toolchains/llvm/prebuilt/windows-x86_64 --sysroot=E:/programs/ndk/android-ndk-r20/toolchains/llvm/prebuilt/windows-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -fno-addrsig -march=armv7-a -mthumb -Wa,--noexecstack -Wformat -Werror=format-security -frtti -fexceptions --std=c++11 -Oz -DNDEBUG -Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libatomic.a -static-libstdc++ -Wl,--build-id -Wl,--warn-shared-textrel -Wl,--fatal-warnings -Wl,--exclude-libs,libunwind.a -Wl,--no-undefined -Qunused-arguments -Wl,-z,noexecstack -Wl,--gc-sections CMakeFiles/tesseract.dir/src/api/tesseractmain.cpp.o -o bin\tesseract libtesseract.a -lpthread E:/programs/vcpkg/installed/arm-android/lib/libleptonica.a E:/programs/vcpkg/installed/arm-android/lib/libgif.a E:/programs/vcpkg/installed/arm-android/lib/libjpeg.a E:/programs/vcpkg/installed/arm-android/share/png/../../lib/libpng16.a E:/programs/vcpkg/installed/arm-android/lib/libtiff.a E:/programs/vcpkg/installed/arm-android/lib/liblzma.a E:/programs/vcpkg/installed/arm-android/lib/libjpeg.a E:/programs/vcpkg/installed/arm-android/share/png/../../lib/libpng16.a E:/programs/vcpkg/installed/arm-android/lib/libtiff.a E:/programs/vcpkg/installed/arm-android/lib/liblzma.a E:/programs/vcpkg/installed/arm-android/lib/libz.a -lm E:/programs/vcpkg/installed/arm-android/lib/libz.a -lm -latomic -lm && cd ."
E:/programs/ndk/android-ndk-r20/toolchains/llvm/prebuilt/windows-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/bin\ld: error: cannot find -lpthread
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.
如您所见,链接器找不到 pthread !
这是我 vcpkg 使用的 arm-android.cmake :
set(VCPKG_TARGET_ARCHITECTURE arm)
set(VCPKG_CRT_LINKAGE dynamic)
set(VCPKG_LIBRARY_LINKAGE static)
set(VCPKG_CMAKE_SYSTEM_NAME Android)
set(VCPKG_BUILD_TYPE release)
我设置了这些变量:
set "ANDROID_NDK=E:\programs\ndk\android-ndk-r20\"
set "ANDROID_NDK_HOME=E:\programs\ndk\android-ndk-r20\"
解决方案
你不需要全局。毕竟,您是为移动设备构建的,您不会在其中进行培训。引用 glob的文件fileio.cpp
仅用于训练。
Android NDK 的特殊之处在于它没有 libpthread,pthread 实现在 libc 内部。简单的 hack 是将 libc.a 复制到 libpthread.a,或者使用ar命令创建一个空的 libpthread.a 。
您可能会发现预配置的docker 构建环境很有帮助。如果您更喜欢完全集成到 Android Studio 中的 ndk-build 版本,请查看我的 fork:https ://github.com/alexcohn/tess-two 。
推荐阅读
- gluon - charm-glisten 6.0.7 命名不一致是意外吗?
- javascript - 如何使用 Canvas 显示 JavaScript 对象?
- postgresql - C3P0 - 具有 maxConnectionAge 的单一连接
- python - 沿角度选择数组中的索引
- python - 数据抓取 Futbin 播放器图像
- java - 如何使用 Button 重新启动应用程序并清除所有数据
- php - PHP 如果 API 中不再存在,则从数据库中删除行
- mule4 - 我们可以将域项目部署到服务器组或服务器集群中吗?
- ios - 在 Xcode 中将文件图标添加到自定义文件类型
- r - 为什么我不能选择这个矩阵的元素