7
votes

Cmake FindThreads.Cmake ne trouvera pas mon en-tête Pthreads.h

J'utilise Android-Clake pour compiler une application pour Android. Cela crée essentiellement un fichier Toolchain de CMAKE pour l'utilisation de la boîte à outils fournie avec NDK d'Android.

comme avec Cette question connexe , j'ai des problèmes avec la ligne suivante dans mon fichier cmakelists.txt: p> xxx pré>

Le fichier d'en-tête est situé à P>

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


0 commentaires

3 Réponses :


4
votes

Réglage CUKE_Include_Path affectera uniquement le cmake < Code> Find_File et Find_Path commandes. La fonction check_include_files appelée par FindThreads.Cmake n'honore pas cette variable. Pour check_include_files Vous pouvez définir la variable cumake_required_includes à la place: xxx


1 commentaires

De la lecture supplémentaire de FindThreads.Clake Cette réponse est logique, mais elle ne résout pas mon problème pour une raison quelconque. Threads_found n'est toujours pas défini. Je vais essayer de déboguer plus et de mettre à jour ma question quand je trouve le problème. Merci.



5
votes

J'ai trouvé la solution à ce problème après beaucoup de débogage et c'est assez étrange. Essentiellement, FindThreads.Cmake appelle une macro appelée check_include_files code> qui tente de try_compile code> un fichier source qui inclut simplement les en-têtes que le check_include_files code> est fourni avec .

Notez qu'il utilise cmake_required_includes code> comme suggéré par @sakra, c'est utile. p>

Utilisation d'Android-Cumake, le try_compile code> macro tente de Compilez avec le compilateur ARM-Linux-AndroideaBI-GCC de la NDK avec tous les indicateurs de compilation spécifiés. Le fichier android.toolchain.cmake contient les lignes suivantes qui définissent certaines de ces indicateurs de compilation: p> xxx pré>

La macro try_compile échoue et selon le fichier CMakeError.log contient les éléments suivants: p> xxx pré>

Si vous faites défiler vers la droite de la ligne de compilateur réelle (deuxième du bas), vous pouvez voir le - sysroot =; / ... ... code> section. Même si les lignes de cumake ci-dessus utilisent des cordes échappées, la cmake a transformé cette première citation échappée en un point-virgule et laissa la seconde comme une citation normale, ce qui entraîne un point-virgule dans la ligne de sysroot puis un littéral de chaîne contenant toutes les cumakes_cxx_flags ensuite (facile à voir avec Syntaxe de So's Syntaxe). p>

La solution à ceci est de modifier android.toolchaain.cmake.cmake pour supprimer les citations échappées telles qu'elles sont inutiles. P>

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}" )


0 commentaires

0
votes

ok donc je suis sur CMAKE 3.18.1-g262b901 code>, NDK 21.4.7075529 code>, android Studio 2020.3.1 code>.

. Ce problème se présente, comme vous le savez probablement, car Android inclut pthread.h code> dans libc ++, il n'y a donc pas de package pour Pthread. Le fichier windethreads.cmake code> qui wind_package (threads requis) code> utilise une tentative de tenir compte de telles choses ICI en essayant de compiler un programme avec #include" pthread.h " code > et sur le succès prétendra que cela trouvera un colis. p>

alors pourquoi échoue-t-il? STRUT> dans mon environnement, après avoir enquêté sur le check_include_file code> macro j'ai trouvé Échec de l'erreur suivante P>

include(CheckIncludeFile)
CHECK_INCLUDE_FILE("pthread.h" TEST)
message("TEST: ${TEST}")


0 commentaires