27
votes

Catalina C ++: L'utilisation d'en-têtes <cmath> génère une erreur: aucun membre nommé 'signbit' dans l'espace de noms global

Après la mise à niveau vers Catalina à partir de Mojave, installation: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk dans l'environnement env.

Je ne parviens pas à compiler un programme utilisant l'en-tête <cmath> .

J'ai essayé de changer CFLAGS, CCFLAGS, CXXFLAGS pour pointer vers l'emplacement MacOSSDK qui ne change rien

➜ cat /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cmath | grep "math.h"
#include <math.h>

par exemple la macro: isless est présente dans l'espace de noms global et sur mon ordinateur:

➜ cat math.h | grep "isless"

#define isless(x, y) __builtin_isless((x),(y))
#define islessequal(x, y) __builtin_islessequal((x),(y))
#define islessgreater(x, y) __builtin_islessgreater((x),(y))
➜  pwd
/usr/local/include
➜

Même l'en-tête cmath l'inclut:

Scanning dependencies of target OgreMain
/Applications/Xcode.app/Contents/Developer/usr/bin/make -f OgreMain/CMakeFiles/OgreMain.dir/build.make OgreMain/CMakeFiles/OgreMain.dir/build
[  0%] Building CXX object OgreMain/CMakeFiles/OgreMain.dir/src/OgreASTCCodec.cpp.o
cd /Users/roman/Downloads/ogre-1.12.2/build/OgreMain & /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++  -DOgreMain_EXPORTS -D__ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES=0 -I/Users/roman/Downloads/ogre-1.12.2/OgreMain/src/OSX -I/Users/roman/Downloads/ogre-1.12.2/OgreMain/include/Threading -I/Users/roman/Downloads/ogre-1.12.2/OgreMain/src -I/Users/roman/Downloads/ogre-1.12.2/build/Dependencies/include -I/Users/roman/Downloads/ogre-1.12.2/OgreMain/include -I/Users/roman/Downloads/ogre-1.12.2/build/include -I/Users/roman/Downloads/ogre-1.12.2/OgreMain -isystem /usr/local/include  -Wall -Winit-self -Wcast-qual -Wwrite-strings -Wextra -Wundef -Wmissing-declarations -Wno-unused-parameter -Wshadow -Wno-missing-field-initializers -Wno-long-long -Wno-inconsistent-missing-override  -msse -O3 -DNDEBUG -arch x86_64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk -fPIC -fvisibility=hidden -fvisibility-inlines-hidden   -std=c++11 -o CMakeFiles/OgreMain.dir/src/OgreASTCCodec.cpp.o -c /Users/roman/Downloads/ogre-1.12.2/OgreMain/src/OgreASTCCodec.cpp
In file included from /Users/roman/Downloads/ogre-1.12.2/OgreMain/src/OgreASTCCodec.cpp:29:
In file included from /Users/roman/Downloads/ogre-1.12.2/OgreMain/src/OgreStableHeaders.h:40:
In file included from /Users/roman/Downloads/ogre-1.12.2/OgreMain/include/OgrePrerequisites.h:309:
In file included from /Users/roman/Downloads/ogre-1.12.2/OgreMain/include/OgreStdHeaders.h:10:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cmath:314:9: error: no member named 'signbit' in the global namespace
using ::signbit;
      ~~^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cmath:315:9: error: no member named 'fpclassify' in the global namespace
using ::fpclassify;
      ~~^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cmath:316:9: error: no member named 'isfinite' in the global namespace; did you mean 'finite'?
using ::isfinite;

Et ma ligne de commande a l'option -isystem /usr/local/include

Cela devrait fonctionner ...


3 commentaires

xcode-select -p correspond-il à l'emplacement de Xcode? Pouvez-vous changer le code en using std::signbit; , de même pour les autres? Compilez-vous en C ++ 11 ou version ultérieure?


Compiler en C ++ 11. Je ne peux pas changer le code, c'est une dépendance externe! oui xcode-select -p correspond à l'emplacement de XCode .


Ce n'est pas bon. Le code essaie de faire en using ::signbit; et le symbole n'est pas dans l'espace de noms global, il est dans l'espace de noms std:: . Je présume de même avec les autres (je ne les ai pas chassés).


11 Réponses :


10
votes

Je suis curieux: quel compilateur utilisez-vous? Quelle est la valeur de CMAKE_OSX_SYSROOT ?

Je suis assez convaincu que c'est le résultat d'un mauvais CMAKE_OSX_SYSROOT . J'ai eu le problème que vous décrivez lors de l'utilisation de liaisons python pour clang (où CMake ne gère pas l'appel du compilateur), mais j'ai réussi à recréer l'erreur dans CMake en faisant:

set(CMAKE_CXX_FLAGS "[...] -isysroot /sdk/path")

J'ai résolu mon problème en suivant les réponses à cette question: Impossible de compiler les packages R avec du code c ++ après la mise à jour vers macOS Catalina .

Pour résumer: Sur Catalina, /usr/include est purgé et protégé par SIP. Ainsi, tout projet qui s'attend à ce que les en-têtes C y soient trouvés échouera à se compiler. Si je me souviens bien, Apple recommande de déposer des rapports de bogue pour les projets qui attendent des en-têtes C dans /usr/include .

Vous devez pointer le système de construction du code que vous essayez de compiler vers les bons en-têtes:

(1) Assurez-vous que Xcode est à jour. On ne sait pas ce qu'un Xcode obsolète sur Catalina pourrait faire à votre environnement de construction.

(2) Utilisez l' -isysroot /sdk/path du -isysroot /sdk/path , où /sdk/path est le résultat de xcrun --show-sdk-path . Je ne sais pas quelle est la meilleure pratique de CMake, mais essayez de faire

set(CMAKE_OSX_SYSROOT /sdk/path)

ou

set(CMAKE_OSX_SYSROOT "")  # Reset.

Si cela résout le problème, vous souhaiterez peut-être rechercher un meilleur moyen de le faire dans CMake.

Bien sûr, si vous êtes aventureux, vous pouvez également désactiver SIP, comme suggéré dans la réponse à ma question: / usr / include missing sur macOS Catalina (avec Xcode 11)


1 commentaires

set(CMAKE_OSX_SYSROOT ...) va dans CMakeLists.txt , pas dans le shell.



12
votes

J'ai le même problème en essayant de cibler iOS (à la fois sur mon MacBook Air et sur GitHub Actions runner) et voici quelques réflexions supplémentaires sur le problème même si je ne connais pas suffisamment l'écosystème d'Apple pour suggérer une solution appropriée. La ligne de commande originale provenait de CMake dans cpprestsdk, mais une fois que je l'ai résumée à l'essentiel, voici une courte repro.

  1. Créez le fichier cmath-bug.cpp avec la seule ligne:
$ xcode-select -p
/Applications/Xcode.app/Contents/Developer
$ xcrun --show-sdk-path -sdk iphoneos13.2
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.2.sdk
  1. Exécuter (les retours à la ligne devant certains arguments sont pour faciliter la lecture, supprimez-les)
ignoring nonexistent directory "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.2.sdk/usr/include/c++/v1"

Lorsque je l'exécute, je connais beaucoup de personnes confrontées au même problème:

#include <...> search starts here:
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.2.sdk/usr/include
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1

Les 2 seuls répertoires d'inclusion que je passe sur ma ligne de commande d'origine existent et sont:

#include <__config>

#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
#pragma GCC system_header
#endif

#include_next <math.h>

#ifdef __cplusplus

// We support including .h headers inside 'extern "C"' contexts, so switch
// back to C++ linkage before including these C++ headers.
extern "C++" {

#include <type_traits>
#include <limits>

// signbit

#ifdef signbit

template <class _A1>
_LIBCPP_INLINE_VISIBILITY
bool
__libcpp_signbit(_A1 __lcpp_x) _NOEXCEPT
{
    return signbit(__lcpp_x);
}

#undef signbit

template <class _A1>
inline _LIBCPP_INLINE_VISIBILITY
typename std::enable_if<std::is_floating_point<_A1>::value, bool>::type
signbit(_A1 __lcpp_x) _NOEXCEPT
{
    return __libcpp_signbit((typename std::__promote<_A1>::type)__lcpp_x);
}

...

#elif defined(_LIBCPP_MSVCRT)
...
#endif  // signbit

Mais les éléments intéressants ici sont les répertoires d'inclusion non existants qu'il signale ainsi que les répertoires d'inclusion qu'il finit par rechercher et leur ordre. Je suppose que les répertoires supplémentaires non mentionnés sur la ligne de commande sont insérés par le pilote d'Apple Clang en fonction d'une logique spécifique à Apple.

Vous pouvez voir à partir de l'erreur signalée que l'en-tête <cmath> se trouve à: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/cmath et à la ligne 304 de celui-ci, vous peut voir:

#include <__config>      // Line 304
#include <math.h>        // This one ends up causing troubles
#include <__cxx_version>

À en juger par le fait que dans ce même dossier /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/ il y a un fichier math.h qui fournit les définitions nécessaires, par exemple:

$ ls -alF /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.2.sdk
lrwxr-xr-x  1 root  wheel    12B Dec 17 11:54 /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.2.sdk@ -> iPhoneOS.sdk
$ ls -alF /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.2.sdk/usr/include
total 2160
drwxr-xr-x  169 root  wheel   5.3K Dec 17 12:07 ./
drwxr-xr-x    5 root  wheel   160B Nov  4 19:22 ../
 ...
-rw-r--r--    9 root  wheel    32K Nov  4 19:52 math.h
 ...

les auteurs de <cmath> s'attendaient à ce que le math.h de ce même dossier soit inclus en premier, puis la directive #include_next <math.h> trouve le math.h spécifique au système. Ce n'est cependant pas ce qui se passe en réalité.

Si vous regardez les 2 premières entrées dans les répertoires recherchés:

Apple clang version 11.0.0 (clang-1100.0.33.16)
Target: arm64-apple-ios13.2
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
 "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang" -cc1 -triple arm64-apple-ios13.2.0 -Wdeprecated-objc-isa-usage -Werror=deprecated-objc-isa-usage -Werror=implicit-function-declaration -emit-obj -mrelax-all -disable-free -disable-llvm-verifier -discard-value-names -main-file-name cmath-bug.cpp -mrelocation-model pic -pic-level 2 -mthread-model posix -mdisable-fp-elim -fno-strict-return -masm-verbose -munwind-tables -target-sdk-version=13.2 -target-cpu cyclone -target-feature +fp-armv8 -target-feature +neon -target-feature +crypto -target-feature +zcm -target-feature +zcz -target-feature +sha2 -target-feature +aes -target-abi darwinpcs -fallow-half-arguments-and-returns -dwarf-column-info -debugger-tuning=lldb -ggnu-pubnames -target-linker-version 530 -v -coverage-notes-file /Users/myuser/Projects/C++/cmath-bug.gcno -resource-dir /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/11.0.0 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.2.sdk -isystem /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.2.sdk/usr/include -stdlib=libc++ -internal-isystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1 -Wno-framework-include-private-from-public -Wno-atimport-in-framework-header -Wno-extra-semi-stmt -Wno-quoted-include-in-framework-header -std=c++11 -fdeprecated-macro -fdebug-compilation-dir /Users/myuser/Projects/C++ -ferror-limit 19 -fmessage-length 204 -stack-protector 1 -fstack-check -mdarwin-stkchk-strong-link -fblocks -fencode-extended-block-signature -fregister-global-dtors-with-atexit -fobjc-runtime=ios-13.2.0 -fcxx-exceptions -fexceptions -fmax-type-align=16 -fdiagnostics-show-option -fcolor-diagnostics -o cmath-bug.o -x c++ cmath-bug.cpp
clang -cc1 version 11.0.0 (clang-1100.0.33.16) default target x86_64-apple-darwin19.0.0
ignoring nonexistent directory "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.2.sdk/usr/include/c++/v1"
ignoring nonexistent directory "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.2.sdk/usr/local/include"
ignoring nonexistent directory "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.2.sdk/Library/Frameworks"
ignoring duplicate directory "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.2.sdk/usr/include"
#include "..." search starts here:
#include <...> search starts here:
 /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.2.sdk/usr/include
 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1
 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/11.0.0/include
 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include
 /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.2.sdk/System/Library/Frameworks (framework directory)
End of search list.
In file included from cmath-bug.cpp:1:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cmath:318:9: error: no member named 'signbit' in the global namespace
using ::signbit;
      ~~^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cmath:319:9: error: no member named 'fpclassify' in the global namespace
using ::fpclassify;
      ~~^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cmath:320:9: error: no member named 'isfinite' in the global namespace; did you mean 'finite'?
using ::isfinite;
      ~~^

vous voyez que le répertoire d'inclusion spécifique au système finit par être au-dessus du répertoire de bibliothèque standard injecté par Clang, c'est pourquoi le math.h spécifique au système est trouvé, et non celui dans le même dossier que le reste des en-têtes de bibliothèque standard. C'est probablement le cas car si j'ajoute explicitement le répertoire d'inclusion de la bibliothèque standard à ma ligne de commande AVANT les deux autres répertoires -isystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1 le problème disparaît et je suis en mesure de compiler le fichier. Ce n'est pas ce que le pilote de Clang ou tout ce qui est impliqué ici fait automatiquement: il ajoute ce répertoire de bibliothèque standard via -internal-system (pas sûr de la sémantique de cet indicateur interne) et il l'ajoute APRÈS le répertoire système.

Maintenant, si vous regardez la liste des répertoires ignorés, la toute première entrée de cette liste est:

clang -v -x c++ -target arm64-apple-ios13.2 -fcolor-diagnostics -std=c++11 -stdlib=libc++ 
-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.2.sdk 
-isystem  /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.2.sdk/usr/include
-c cmath-bug.cpp

dont la partie c++/v1 n'existe pas sur ma machine, ce qui me fait me demander si l'installation du SDK iPhone était censée créer un lien symbolique c++ à l'intérieur de la partie existante du chemin pour pointer vers /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++ pour que tout fonctionne.

Quoi qu'il en soit, c'est ce que je pense qui se passe et je me demande si quelqu'un sait comment résoudre correctement ce problème?

Merci!

PS Pour le contexte:

    #include <cmath>


3 commentaires

Merci pour votre explication des détails. Mais malheureusement, aucune solution ne semble fonctionner pour ma machine. Je suis sur le point de choisir la dernière option pour réinstaller Catalina. Damn Apple, pourquoi ils rendent les choses si difficiles?


J'ai suivi ces directions, d'en haut, pour coder en dur un chemin vers math.h. Cela a bien fonctionné pendant un certain temps, mais je soupçonne qu'une version plus récente de Xcode a cassé cela et j'ai eu des erreurs de compilation impliquant math.h. Ne faites donc pas cela en Using #include</Applications/Xcode.app/Contents/Developer/Toolchai‌​ns/XcodeDefault.xcto‌​olchain/usr/include/‌​c++/v1/math.h> instead of <math.h> in /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeD‌​efault.xctoolchain/u‌​sr/include/c++/v1/cm‌​ath !!!


De mon côté, le problème a été résolu en supprimant le répertoire /Library/Developer/CommandLineTools . Je construisais Swift pour Android sur macOS Catalina.



2
votes

Il est possible que votre copie de Xcode soit corrompue. Vérifiez avec le code:

file added: /Applications/Xcode-11.3.1-.app/Contents/Developer/Library/Frameworks/Python3.framework/Versions/3.7/lib/python3.7/json/__pycache__/scanner.cpython-37.pyc
file added: /Applications/Xcode-11.3.1-.app/Contents/Developer/Library/Frameworks/Python3.framework/Versions/3.7/lib/python3.7/json/__pycache__/decoder.cpython-37.pyc
file added: /Applications/Xcode-11.3.1-.app/Contents/Developer/Library/Frameworks/Python3.framework/Versions/3.7/lib/python3.7/json/__pycache__/encoder.cpython-37.pyc
file added: /Applications/Xcode-11.3.1-.app/Contents/Developer/Library/Frameworks/Python3.framework/Versions/3.7/lib/python3.7/json/__pycache__/__init__.cpython-37.pyc
file modified: /Applications/Xcode-11.3.1-.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/usr/include/math.h
file modified: /Applications/Xcode-11.3.1-.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include/math.h
file modified: /Applications/Xcode-11.3.1-.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS.sdk/usr/include/math.h
file modified: /Applications/Xcode-11.3.1-.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/math.h
file modified: /Applications/Xcode-11.3.1-.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/Kernel.framework/Versions/A/Headers/math.h
file modified: /Applications/Xcode-11.3.1-.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/DriverKit19.0.sdk/System/DriverKit/usr/include/math.h
file modified: /Applications/Xcode-11.3.1-.app/Contents/Developer/Platforms/WatchSimulator.platform/Developer/SDKs/WatchSimulator.sdk/usr/include/math.h
file modified: /Applications/Xcode-11.3.1-.app/Contents/Developer/Platforms/AppleTVSimulator.platform/Developer/SDKs/AppleTVSimulator.sdk/usr/include/math.h
file modified: /Applications/Xcode-11.3.1-.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/usr/include/math.h

Cela m'est arrivé et le problème était un Xcode corrompu. La réinstallation l'a corrigé.

Quelque chose avait modifié ce qui suit:

codesign --verify /Applications/Xcode.app

math.h était vide dans tous les endroits ci-dessus.


0 commentaires

1
votes

L'analyse de @ solodon est parfaite. Le problème est probablement que le fichier cmath la mauvaise version de math.h fonction de l'ordre de recherche des fichiers d'en-tête. Du moins, c'est ce qui m'arrivait lorsque j'obtenais la même erreur.

Analysez la sortie de votre compilateur pour la recherche #include <...> search starts here: Vous pouvez également forcer cette sortie depuis la ligne de commande avec (source) :

XCBASE=`xcrun --show-sdk-path`
export CPLUS_INCLUDE_PATH=$XCBASE/usr/include

Ça devrait ressembler a quelque chose comme ca:

 /usr/local/include
 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/11.0.0/include
 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include
 /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include
 /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks (framework directory)

Notez que les chemins avec Toolchains précèdent ceux avec Platforms . Si dans votre cas l'ordre est inversé, vous devez déterminer ce qui dans votre configuration en est la cause. Pour moi, c'était un paramètre explicite de CPLUS_INCLUDE_PATH dans mon script de connexion.

Code incriminé:

gcc -Wp,-v -E -

Cela faisait partie de ma tentative de contourner Xcode 11 ne fournissant plus le package d'installation pour les fichiers d'en-tête du SDK. Après avoir supprimé ce code, j'ai réussi à inclure cmath dans mon code C ++.

Si vous êtes venu ici à la recherche de solutions à ce problème, vous aurez peut-être besoin d'une solution différente, mais j'espère que cela aidera à faire la lumière sur ce qui semble être la cause première de ce problème, l'ordre du chemin de recherche du fichier d'en-tête.


2 commentaires

Y a-t-il des recommandations sur la façon de résoudre ce problème? J'ai essayé de désinstaller à la fois les outils de ligne de commande et Xcode (11.4.1), mais l'ordre de #include<...> search est toujours incorrect.


La seule chose à laquelle je peux penser est de regarder dans vos scripts de connexion tels que ~/.bash_profile , ~/.zshrc etc. pour les choses qui peuvent affecter l'ordre de recherche comme les variables d'environnement du compilateur (dans mon cas, c'était CPLUS_INCLUDE_PATH ) ou le ordre des répertoires dans votre PATH .



0
votes

J'ai trouvé que dans mon projet, j'ai le fichier math.h Après l'avoir renommé, le problème a disparu. Les coutures cmath incluent mon fichier au lieu du système.


0 commentaires

2
votes

Je viens de recevoir cette erreur en essayant de compiler gRPC après une récente mise à niveau vers 10.15.4 et Xcode 11.4 et j'ai commencé à regarder toutes les solutions proposées (ici et impossible de compiler un programme C sur un Mac après la mise à niveau vers Catalina 10.15 ) , et en a essayé quelques-uns (sans essayer de recréer /usr/include car cela violerait la séparation qu'Apple essayait de créer) - rien ne semblait fonctionner.

J'ai alors regardé attentivement les invocations de complier réelles que la make processus a été la production et remarqué qu'il y avait un explicite

-I/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include

cela provoquait finalement les inclusions dans le mauvais ordre - la suppression de ce chemin d'inclusion explicite a permis à la compilation de réussir avec une installation par défaut de catalina, Xcode et les outils de ligne de commande Xcode, comme vous vous en doutez, pas d'autres astuces / indicateurs de compilateur nécessaire.


4 commentaires

J'ai également rencontré ce problème. Il s'avère que certains fichiers pkg-config (par exemple libcurl) de Homebrew ajoutent ce chemin automatiquement, même si vous avez installé Xcode. Ce problème a été résolu dans Homebrew 2.2.13. Plus de détails sur github.com/Homebrew/brew/issues/5068 ; Le PR qui corrige ce problème se trouve sur github.com/Homebrew/brew/pull/7331 . TL; DR: Mettre à jour l'homebrew


Oui, c'était un vieux homebrew pkg_config pour zlib qui traînait encore d'une manière ou d'une autre, ce qui me causait cela - malgré le fait d'avoir un homebrew à jour et de ne pas avoir installé de zlib de toute façon


La cause est la même que @solodon mentionnée. J'ai obtenu cela avec le SDK MacOSX comme décrit ici, find_package récupéré le SDK usr/include include en raison de CMake find_package récupérant par exemple zlib. Le correctif consistait à mettre le dossier usr/include/c++/v1 la chaîne d'outils sur le système includes ( -isystem to clang, ou include_directories(SYSTEM ...) dans CMake). J'ai déduit le répertoire de la chaîne d'outils du chemin CMAKE_LINKER plutôt que de le coder en dur.


Cette réponse m'a également été très utile. Dans mon cas, j'avais eu une telle inclusion explicite dans ma variable d'environnement Go CGO_CPPFLAGS, laissée par un projet qui n'a pas été mis à jour pour savoir où le fichier Darwin stdio.h pouvait être trouvé mais llvm n'était pas utilisé explicitement dans celui-là, et je l'ai reporté à un projet qui était déjà à jour avec la construction à partir du dernier Darwin mais maintenant, ayant besoin d'avoir les fichiers LLVM c ++ / v1 cohérents avec eux-mêmes, cette aide explicite pour trouver les en-têtes Darwin était problème. C'était une aide énorme.



6
votes

En utilisant la commande:

/usr/local/include
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/10.0.1/include
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include
/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include
/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/System/Library/Frameworks (framework directory)

ma séquence de recherche #include <...>:

gcc -Wp,-v -E -

La raison de l'erreur #include est décrite ci-dessous:

  • #include<cmath> réside dans /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1
  • Il inclut <math.h> .
  • Il recherche le /usr/local/include car il s'agit du premier répertoire à rechercher. Il y a un math.h dans le répertoire /usr/local/include/c++/9.3.0/
  • Il essaie de l'utiliser.
  • Mais l'attente était d'utiliser le math.h du même répertoire /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1
  • Le math.h de /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1 inclut math.h de /usr/local/include utilisant #include_next<math.h>
  • Comme le mauvais math.h est inclus / lié à /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/cmath , l'erreur de compilation se produit

Le correctif:

  1. Si nous pouvons modifier l'ordre de recherche de #include<...> pour rechercher /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1 dans un premier temps, cela peut être corrigé.

  2. Utilisation de #include</Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/math.h> au lieu de <math.h> dans /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/cmath

J'ai suivi l'option n ° 2 et la construction est réussie maintenant!

Et merci à solodon pour la réponse détaillée. J'ai suivi la réponse pour résoudre le problème.


8 commentaires

Salut Niloy Datta! Je vous suggère de modifier cette réponse en supprimant la question de cette réponse et de n'inclure que les réponses. Si vous avez une question, posez-la séparément de la manière appropriée, les questions doivent être posées dans cette communauté.


@TiagoMartinsPeres 李大仁, l'a supprimé. Merci.


Merci mec, ça a marché pour moi. Connaissez-vous un moyen plus propre de résoudre ce problème?


@VictorSanchez, essayant toujours de le comprendre. Je notifierai une fois que je l'aurai.


Le problème est que lorsque j'utilise PCL, je dois faire le changement mais d'autres fois, j'importe juste cmath, je dois l'inverser


voir mon commentaire ci-dessus sur le fait que le codage en dur d'un chemin vers math.h est une mauvaise idée.


Au lieu de 2, envisagez de changer <cmath> pour faire #include "./math.h" . Cela évite d'avoir à y mettre le nom de fichier complet et fonctionne toujours (pour moi, du moins).


Peu importe la façon dont j'ai changé l'ordre des chemins d'inclusion, je n'ai pas pu obtenir <cmath> pour charger le bon <math.h>. #include "./math.h" ne fonctionnait pas non plus. Seul l'inclusion du chemin complet a résolu le problème pour moi. Je déteste ça, ça va me donner des maux de tête plus tard, mais c'est la seule chose qui a fonctionné pour moi. libclang doit faire quelque chose de bizarre avec le chemin de recherche.



1
votes

Vous pouvez essayer d'utiliser le SDK CommandLineTools plutôt que le SDK XCode.app.

Je corrige ce problème lorsque je compile PointCloudLibrary (PCL)

#Check the current sdk
xcrun --show-sdk-path

#Change sdk
sudo xcode-select -s /Library/Developer/CommandLineTools          #Using CommandLineTools SDK
sudo xcode-select -s /Applications/Xcode.app/Contents/Developer   #Using XCode.app SDK

En outre, réinstallez XCode.app et CommandLineTools peut vous aider.


0 commentaires

0
votes

Résumé: dans mon cas, le script de construction utilisait une ancienne version de la chaîne d'outils ios-cmake (2.1.2) et sa mise à jour vers la version 3.1.2 a corrigé le problème d'inclusion cmath / math.

Adapter la commande astucieuse proposée par @Ryan H. gcc -Wp,-v -E - pour mon cas (clang, c ++, cible iOs)

CompileC /Users/<...>/build.Release.ios/<...>.o <...>.cpp normal arm64 c++ com.apple.compilers.llvm.clang.1_0.compiler
-Isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.4.sdk <...>
 -I/Users/<...>/Build_iOS/build.Release.ios/build.arm/Binaries/Release/include
 -Isystem /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.4.sdk/usr/include
 -I/Users/<...>/Build_iOS/build.Release.ios/build.arm/src/<...>.build/Release-iphoneos/<...>/DerivedSources/arm64
...

donne sur deux Catalina dont un vierge où le seul outil jamais installé est XCode 11.14.1:

 clang -cc1 version 11.0.3 (clang-1103.0.32.59) default target x86_64-apple-darwin19.4.0
ignoring nonexistent directory "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.4.sdk/usr/include/c++/v1"
ignoring nonexistent directory "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.4.sdk/usr/local/include"
ignoring nonexistent directory "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.4.sdk/Library/Frameworks"
#include "..." search starts here:
#include <...> search starts here:
 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1
 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/11.0.3/include
 /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.4.sdk/usr/include
 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include
 /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.4.sdk/System/Library/Frameworks (framework directory)
End of search list.

Le chemin d'inclusion correct est donc le premier non ignoré, tout devrait fonctionner correctement, mais ce n'est pas le cas. Il semble que le problème provienne d'une commande d'inclusion supplémentaire ajoutée à l'appel de compilation par la chaîne d'outils ios-cmake:

clang -x c++ -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.4.sdk -Wp, -v -E -

Le coupable était la ligne -Isystem ... , qui entraînera la ligne #include <math> dans le fichier cmath pour finir par charger le mauvais fichier. Après avoir essayé de réparer les scripts cmake, j'ai remarqué l'ancienne version d'ios-cmake, et sa mise à jour avait le `` seul '' effet de supprimer la ligne indésirable -Isystem - tout le reste était presque le même (à part quelques compilateurs option)


0 commentaires

1
votes

La solution de @mkl aide à résoudre le problème similaire de mon côté. Merci.

Problème et solution de mon côté

J'ai eu le même problème pour compiler un projet sur la base de PCL . La solution consiste à définir le SDK CommandLineTools CMAKE_OSX_SYSROOT.

J'ai essayé la solution de @ mkl pour le faire dans CMakeLists.txt, cela ne fonctionne pas. Pour que je ne puisse le définir que par cmake .. -DCMAKE_OSX_SYSROOT="/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk"

Autre chose à mentionner: il existe deux versions de SDK en ligne de commande dans mon MacOS:

-- Found OpenGL: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/System/Library/Frameworks/OpenGL.framework

xcrun --show-sdk-path donne la valeur par défaut, mais en fait seul MacOSX10.14.sdk fonctionne de mon côté.

Discussion du problème similaire dans le repo de PCL: https://github.com/PointCloudLibrary/pcl/issues/2601#issuecomment-621889211

Différence entre les SDK

Je ne sais pas grand-chose sur cmake et les SDK en c ++. La différence que j'ai remarquée dans le journal de construction cmake à partir de différents SDK comme suit:

/Library/Developer/CommandLineTools/SDKs/MacOSX :

-- Found OpenGL: /Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/OpenGL.framework

/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk

-- Found OpenGL: /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/OpenGL.framework

Par défaut:

~ » /Library/Developer/CommandLineTools/SDKs/MacOSX
/Library/Developer/CommandLineTools/SDKs/MacOSX
MacOSX.sdk/       MacOSX10.14.sdk@

On dirait que le problème se produit lors du choix du SDK pour Opengl.

Comment le faire dans CMakeLists.txt?

J'ai apprécié si quelqu'un pouvait donner des conseils.


0 commentaires

1
votes

Réinstaller Xcode, les outils de commande et les homebrews, et

sudo rm -rf /usr/local/include

corrigé ce problème pour moi.


0 commentaires