2017-01-19 4 views
1

Я пытаюсь найти функции из моей стандартной библиотеки C++ по их искаженному имени. Я на MacOS, поэтому с помощью команды nm я могу осмотреть dylib:Где std :: endl в моей скомпилированной стандартной библиотеке?

nm -g /usr/local/lib/libc++.dylib 
nm -g /usr/local/lib/libc++abi.dylib 

В выходе, я могу найти подогнанные имена для std::cout:

0000000000079ec0 S __ZNSt3__14coutE 
0000000000079f60 S __ZNSt3__15wcoutE 
etc... 

Однако я не нахожу Записи для std::endl.

Интересно, что мой LLVM IR переводчик также не может найти std::endl, хотя std::cout работает отлично:

LLVM ERROR: Program used external function  
'__ZNSt3__14endlIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_' which could not be resolved! 

Где я должен ожидать, чтобы найти std::endl на моей системе?

+0

Вы можете попытаться найти 'зЬй :: flush'? – Rakete1111

+2

Я подозреваю, что 'std :: endl' не связывается, поскольку это просто' << '\ n' << std :: flush' – YSC

+0

'std :: flush' похоже присутствует:' 0000000000011bb0 T __ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE5flushEv' – sdgfsdh

ответ

2

Как указано в YSC, std::endl - это функция (возможно, встроенная), и все, что она делает, выводит конечную строку \n, затем звоните flush.

http://en.cppreference.com/w/cpp/io/manip/endl

Похоже libcxx имеет скрытый Endl: https://github.com/llvm-mirror/libcxx/blob/master/include/ostream#L999

Хотя вровень не имеет такого атрибута: https://github.com/llvm-mirror/libcxx/blob/master/include/ostream#L938

+1

Ум ... это [ясно] (http://en.cppreference.com/w/cpp/io/manip/endl) шаблон, так что это причина, почему он не компилируется в стандарт C++ библиотека. Независимо от того, навязывается ли оно или нет, это совсем другое дело. – IInspectable

+0

[std :: flush] (http://en.cppreference.com/w/cpp/io/manip/flush) также является шаблоном – crezefire

+0

Итак? OP никогда не указывал, что 'std :: flush' будет экспортироваться из их стандартной библиотеки C++. Я не понимаю, что вы пытаетесь сделать. – IInspectable

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