ndk r20 ld:ld:错误:找不到-lpthread

时间:2019-07-31 11:15:14

标签: android c++ android-ndk tesseract ld

我正在尝试使用vcpkg和ndk r20为Android手臂构建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\"

1 个答案:

答案 0 :(得分:2)

您不需要glob。毕竟,您正在为不进行培训的移动设备而建造。指向glob的文件fileio.cpp仅用于培训。

Android NDK的特殊之处在于它没有libpthread,pthread实现位于libc内部。简便的方法是将 libc.a复制到libpthread.a,或使用 ar 命令创建一个空的libpthread.a。

您可能会发现预配置的docker build environment很有帮助。如果您喜欢完全集成到Android Studio中的ndk-build版本,请查看我的fork:https://github.com/alexcohn/tess-two