2016-08-09 2 views
1

Я заметил, что символ СТД :: uncaught_exceptions отсутствует на складе LibC++ на моем Mac:Mac OSX LibC++ отсутствует StD :: uncaught_exceptions символ

$ 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 

Однако заголовок объявляет прототип:

$ 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; 

Это плохой сбор или что-то в этом роде? Из источника libC++ я вижу, что символ должен быть в libC++, но его нет, и при связывании я получаю недостающий символ.

Edit: здесь есть минимальная программа недостаток:

$ 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

Вопрос в том, что вы на самом деле компилируетесь с 'C++ 17'? в 'C++ 11' это все равно bool' std :: uncaught_exception() ', поэтому попробуйте использовать это вместо этого. –

+0

Компиляция была выполнена с помощью '-std = C++ 1z'. Проблема не на этапе компиляции, где прототип std :: uncaught_exceptions отображается в заголовке исключения, но при времени связывания, когда символ отсутствует в библиотеке. – Engineerist

+0

Возможно, покажите, как вы используете его в своем коде; У меня есть подозрение, хотя это может быть ошибка. Если вы сравниваете заголовок исключения из магистрали llvm с версией OS X, не существует декларации '#ifndef _LIBCPP_NO_EXCEPTIONS', а также' uncaught_exception_count() '... Неясно, связано ли это с этим. Я могу скомпилировать код с 'C++ 1z' ​​и' uncaught_exceptions', хотя, когда я пытаюсь вызвать метод, я получаю ту же ошибку, что и вы. –

ответ

1

Прошло некоторое время (несколько лет), так как Apple, думал, что это достаточно важно, чтобы обновить LibC++ dylib.. Я слышу слухи, что может будет обновлен в ОС после El Capitan.

Что случилось с Swift?! ;-)

+1

Я этого не знал. Тогда я буду считать это дефектом. – Engineerist

+1

Он по-прежнему не обновляется. 'dyld: Символ не найден: __ZdlPvSt11align_val_t Репутация от: /usr/local/Cellar/verilator/3.912/bin/verilator_bin Ожидается в:/usr/lib/libC++. 1.dylib' – Barry

+0

@Barry Я просто проверил минимальный OP неудачная программа по Сьерре, 10.12.6 и она прошла. На какой ОС вы тестируете? Я обновлю этот ответ с последней информацией. –

 Смежные вопросы

  • Нет связанных вопросов^_^