Samstag, Februar 22, 2020

CMake FindThreads.cmake nicht finden, meine pthreads.h-header

Ich bin mit android-cmake zu kompilieren einer Anwendung für Android. Dies ist im wesentlichen erstellt ein CMake-toolchain-Datei für die Verwendung der toolchain mit Android NDK.

Als mit in diesem Zusammenhang Frage, ich habe Probleme mit der folgenden Zeile in meiner CMakeLists.txt Datei:

find_package(Threads REQUIRED)

Die header-Datei befindet sich bei

~/Android/android-ndk-r7/platforms/android-8/arch-arm/usr/include/pthread.h

Die Bibliothek-Datei befindet sich bei

~/Android/android-ndk-r7/platforms/android-8/arch-arm/usr/lib/libthread_db.so

Das problem ist, dass FindThreads.cmake ruft CHECK_INCLUDE_FILES("pthread.h", CMAKE_HAVE_PTHREAD_H) – und dies scheint sich nicht die Mühe zu prüfen, die in diesem Verzeichnis.

Laut CMake ist Nützlich, Variablen wiki-Seite CMAKE_INCLUDE_PATH ermöglicht die Einstellung header search path, CMAKE_LIBRARY_PATH ermöglicht die Einstellung des library-Suchpfad, und CMAKE_PREFIX_PATH scheint sowohl für find_package.

Jedoch, trotz ob ich das setzen von Umgebungsvariablen vor dem ausführen von cmake…

export CMAKE_INCLUDE_PATH=~/Android/android-ndk-r7/platforms/android-8/arch-arm/usr:~/Android/android-ndk-r7/platforms/android-8/arch-arm/usr/include

… oder ob ich Sie direkt in CMakeLists.txt…

if(ANDROID)
    set(CMAKE_INCLUDE_PATH
        ${ANDROID_NDK_SYSROOT}/usr
        ${ANDROID_NDK_SYSROOT}/usr/include
        ${CMAKE_INCLUDE_PATH}
    )

    set(CMAKE_LIBRARY_PATH
        ${ANDROID_NDK_SYSROOT}/usr
        ${ANDROID_NDK_SYSROOT}/usr/lib
        ${CMAKE_LIBRARY_PATH})

    set(CMAKE_PREFIX_PATH
        ${ANDROID_NDK_SYSROOT}
        ${CMAKE_PREFIX_PATH})

    message(${ANDROID_NDK_SYSROOT})
    message(${CMAKE_INCLUDE_PATH})

endif()

find_package(Threads REQUIRED)

… (und dieser nicht ausgeführt wird, die Nachrichten, die gedruckt werden), und wo ${ANDROID_NDK_SYSROOT} enthält

/Users/martin/Android/android-ndk-r7/platforms/android-8/arch-arm

Ich bekomme die Meldung immer noch

Konnte NICHT finden Threads (es fehlen: Threads_FOUND)

Hat jemand irgendwelche Vorschläge, was ich falsch mache?

InformationsquelleAutor Martin Foot | 2011-12-05

2 Kommentare

  1. 4

    Fand ich die Lösung für dieses problem nach einer Menge von debugging-und es ist sehr merkwürdig. Im Wesentlichen, FindThreads.cmake ruft ein makro namens CHECK_INCLUDE_FILES die versucht zu TRY_COMPILE eine source-Datei, die einfach enthält die Header, die CHECK_INCLUDE_FILES makro ist mit.

    Beachten Sie, dass es nicht CMAKE_REQUIRED_INCLUDES wie vorgeschlagen von @sakra also ist es nützlich.

    Android-cmake, die TRY_COMPILE makro versucht, um die Kompilierung mit der arm-linux-androideabi-gcc-compiler von der NDK mit allen angegebenen flags kompilieren. Die android -.toolchain.cmake-Datei enthält die folgenden Zeilen, die einige der diese compile-flags:

    if( BUILD_WITH_ANDROID_NDK )
     set( CMAKE_CXX_FLAGS "--sysroot=\"${ANDROID_NDK_SYSROOT}\" ${CMAKE_CXX_FLAGS}" )
     set( CMAKE_C_FLAGS "--sysroot=\"${ANDROID_NDK_SYSROOT}\" ${CMAKE_C_FLAGS}" )

    Den TRY_COMPILE makro schlägt fehl, und nach den CMakeError.log-Datei enthält die folgenden:

    Run Build Command:/opt/local/bin/gmake "cmTryCompileExec/fast"
    /opt/local/bin/gmake -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build
    gmake[1]: Entering directory '/Users/martin/Repositories/Delta/build/android/CMakeFiles/CMakeTmp'
    "/Applications/CMake 2.8-4.app/Contents/bin/cmake" -E cmake_progress_report /Users/martin/Repositories/Delta/build/android/CMakeFiles/CMakeTmp/CMakeFiles 1
    Building C object CMakeFiles/cmTryCompileExec.dir/CheckIncludeFiles.c.o
    /Users/martin/Android/android-ndk-r7/toolchains/arm-linux-androideabi-4.4.3/prebuilt/darwin-x86/bin/arm-linux-androideabi-gcc   --sysroot=;/Users/martin/Android/android-ndk-r7/platforms/android-8/arch-arm" -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb -march=armv7-a -mfloat-abi=softfp  " -I/Users/martin/Android/android-ndk-r7/sources/cxx-stl/gnu-libstdc++/include -I/Users/martin/Android/android-ndk-r7/sources/cxx-stl/gnu-libstdc++/libs/armeabi-v7a/include -I/Users/martin/Android/android-ndk-r7/platforms/android-8/arch-arm/usr -I/Users/martin/Android/android-ndk-r7/platforms/android-8/arch-arm/usr/include   -o CMakeFiles/cmTryCompileExec.dir/CheckIncludeFiles.c.o   -c /Users/martin/Repositories/Delta/build/android/CMakeFiles/CMakeTmp/CheckIncludeFiles.c
    arm-linux-androideabi-gcc: no input files

    Wenn Sie einen Bildlauf nach rechts auf die aktuelle compiler-Zeile (zweite von unten) sehen Sie die --sysroot=;/... Abschnitt. Obwohl die CMake-Linien über die Verwendung escaped strings, CMake hat sich dieser erste entgangen Angebot in ein Semikolon und Links das zweite als ein normales Angebot, was ein Semikolon in der sysroot Linie und dann ein string-literal, welches alle CMAKE_CXX_FLAGS danach (leicht zu sehen mit SO ‚ s syntax-highlighting).

    Die Lösung, um dies zu ändern android.toolchain.cmake zu entfernen entgangen Angebote, wie Sie unnötig sind.

    if( BUILD_WITH_ANDROID_NDK )
     set( CMAKE_CXX_FLAGS "--sysroot=${ANDROID_NDK_SYSROOT} ${CMAKE_CXX_FLAGS}" )
     set( CMAKE_C_FLAGS "--sysroot=${ANDROID_NDK_SYSROOT} ${CMAKE_C_FLAGS}" )
  2. 3

    Einstellung CMAKE_INCLUDE_PATH wird sich nur auf den CMake – FIND_FILE und FIND_PATH Befehle. Die CHECK_INCLUDE_FILES Funktion aufgerufen FindThreads.cmake nicht Ehren, die variable. Für CHECK_INCLUDE_FILES Sie können die variable CMAKE_REQUIRED_INCLUDES statt:

    set(CMAKE_REQUIRED_INCLUDES 
      ${ANDROID_NDK_SYSROOT}/usr 
      ${ANDROID_NDK_SYSROOT}/usr/include)
    • Von der weiteren Lektüre FindThreads.cmake ist diese Antwort logisch, aber es immer noch nicht beheben mein problem für einige Grund. Threads_FOUND ist noch nicht festgelegt. Werde versuchen zu Debuggen, mehr-und update-meine Frage, wenn ich den Fehler gefunden habe. Danke.

Kostenlose Online-Tests