2016-08-09 1 views
1

J'ai remarqué que std :: symbole de uncaught_exceptions manque de stock libC++ sur mon Mac:Mac OSX libC++ manque std :: uncaught_exceptions symbole

$ clang++ -v; otool -L /usr/lib/libc++.dylib 
Apple LLVM version 7.3.0 (clang-703.0.31) 
Target: x86_64-apple-darwin15.6.0 
Thread model: posix 
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin 
/usr/lib/libc++.dylib: 
    /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.1.0) 
    /usr/lib/libc++abi.dylib (compatibility version 1.0.0, current version 125.0.0) 
... 
$ nm /usr/lib/libc++.dylib | c++filt | grep uncaught 
0000000000007782 T std::uncaught_exception() 
       U ___cxa_uncaught_exception 

Cependant, l'en-tête déclare le prototype:

$ pwd 
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1 
$ grep uncaught_exceptions exception 
int uncaught_exceptions() noexcept; // C++17 
_LIBCPP_FUNC_VIS int uncaught_exceptions() _NOEXCEPT; 

Est-ce une mauvaise construction ou quelque chose? À partir de la source libC++, je vois que le symbole devrait se retrouver dans libC++ mais il n'est pas là et je reçois un symbole manquant lors de la liaison.

Edit: voici un programme d'échec minimal:

$ cat t.cpp; clang++ -std=c++1z t.cpp 
#include <exception> 

int main() { 
    return std::uncaught_exceptions(); 
} 
Undefined symbols for architecture x86_64: 
    "std::uncaught_exceptions()", referenced from: 
     _main in t-a4015f.o 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 
+0

La question est de savoir si vous compilez réellement avec 'C++ 17'? dans 'C++ 11' c'est toujours le bool' std :: uncaught_exception() ', donc essayez plutôt d'utiliser ça. –

+0

La compilation a été faite avec '-std = C++ 1z'. Le problème n'est pas à l'étape de compilation, où le prototype de std :: uncaught_exceptions est visible dans l'en-tête d'exception, mais au moment de la liaison, lorsque le symbole est absent de la bibliothèque. – Engineerist

+0

Peut-être montrer comment vous l'utilisez dans votre code; Je soupçonne cependant que cela pourrait être un bug. Si vous comparez l'en-tête d'exception de la jonction llvm avec la version OS X, il n'y a pas de déclaration '#ifndef _LIBCPP_NO_EXCEPTIONS' ainsi que' uncaught_exception_count() '... Il n'est pas clair si cela a quelque chose à voir avec cela. Je peux compiler du code avec les 'C++ 1z' ​​et' uncaught_exceptions', bien que quand j'essaye d'appeler la méthode j'obtiens la même erreur que toi. –

Répondre

1

Il a été un certain temps (quelques années) puisque Apple a pensé assez important de mettre à jour libC++ dylib.. J'entends des rumeurs pourrait être mis à jour dans l'OS après El Capitan.

Qu'est-ce qui ne va pas avec Swift?! ;-)

+1

Je ne le savais pas. Je vais prendre comme un défaut alors. – Engineerist

+1

Il n'est toujours pas mis à jour. 'dyld: Symbole non trouvé: __ZdlPvSt11align_val_t Référencé par: /usr/local/Cellar/verilator/3.912/bin/verilator_bin Prévu dans:/usr/lib/libC++. 1.dylib' – Barry

+0

@Barry Je viens de vérifier le minimum de l'OP échec du programme sur Sierra, 10.12.6 et il est passé. Sur quel système d'exploitation testez-vous? Je mettrai à jour cette réponse avec les dernières informations. –