Как проверить, установлен ли libc++?

Я строю что-то из исходников. Мои системы gcc и stdlibc++ слишком старые, но есть сборка clang, которую я могу использовать. По умолчанию clang использует stdlibc++, но libc++ может быть дополнительно установлен для использования clang.

Как лучше всего проверить, установлена ​​ли libc++ с clang?


person okovko    schedule 18.07.2016    source источник
comment
Какие ошибки вы получаете?   -  person Fantastic Mr Fox    schedule 18.07.2016
comment
какая система? в различных Linux используйте переключатель запроса диспетчера пакетов для любого имеющегося у вас менеджера пакетов (apt, yum, rpm...). используйте справочную страницу или --help.   -  person CarlH    schedule 18.07.2016
comment
Чтобы использовать C++, вы должны использовать clang++ явно как команду.   -  person Paul Stelian    schedule 18.07.2016
comment
аналогичная проблема Centos clang описана в stackoverflow.com/questions/25840088/   -  person CarlH    schedule 18.07.2016
comment
Ваша ошибка в другом. Если вы явно скомпоновали libc++, а он не установлен, компоновщик сообщит вам, что не может найти libc++.   -  person n. 1.8e9-where's-my-share m.    schedule 18.07.2016


Ответы (4)


Немного лучший ответ, чем @n.n:

printf "#include <ciso646>\nint main () {}" | clang -E -stdlib=libc++ -x c++ -dM - | grep _LIBCPP_VERSION

Если это напечатает что-то вроде: #define _LIBCPP_VERSION 3700, то у вас есть libc++.

person Marshall Clow    schedule 18.07.2016
comment
Этот один лайнер предпочтительнее; по крайней мере, в моей системе подход n.m. нельзя было изменить без повторного ввода всей команды. Не могли бы вы объяснить, что означают некоторые символы, например ‹ciso646› и -E -dM? Также я бы добавил, что в нетривиальной системе со многими версиями сборки clang вы можете заменить clang на path/to/particular-clang-build/bin/clang. - person okovko; 19.07.2016
comment
Что касается #include<ciso646>, я отсылаю вас к stackoverflow.com/questions/31657499/ (что довольно забавно в ответ на другой ответ, который я дал), и clang++ -E -dM говорит clang не компилировать исходный код, а просто предварительно обработать его (-E) и затем распечатать все, что определено (-dM) - person Marshall Clow; 19.07.2016

Самый простой способ проверить, установлена ​​ли библиотека libc++, — использовать ее в простой программе:

 clang++ -xc++ -stdlib=libc++ - <<EOF
 int main(){}
 EOF

Если это не удается, у вас нет libc++.

В реальном приложении добавьте пользовательские параметры компилятора и компоновщика:

 clang++ $(CXXFLAGS) $(LDFLAGS) -xc++ -stdlib=libc++ - <<EOF

чтобы у пользователя была возможность указать, что libc++ установлен в нестандартном месте.

person n. 1.8e9-where's-my-share m.    schedule 18.07.2016
comment
документы libc++ предоставляют подробную информацию о том, что $(CXXFLAGS) и $(LDFLAGS) будут в практическом приложении. - person okovko; 18.07.2016

Вот как проверить, установлена ​​ли библиотека:

Введите ldconfig -p | grep libc++ в терминал. Неважно, какую систему вы используете. Если libc++ не установлен, терминал ничего не скажет. Если он установлен, он отобразит доступные версии.

person Community    schedule 18.07.2016
comment
@okovko Проверьте это. Он покажет вам, как установить программное обеспечение в вашей системе. Попытайся. ask.fedoraproject.org/en/question/7863/ После этого мы можем удалить это обсуждение, поскольку оно устарело. - person ; 18.07.2016
comment
Было бы неплохо просто установить что-то свежее, но об этом не может быть и речи, так как это не моя система. - person okovko; 18.07.2016
comment
@okovko Держите его под рукой на всякий случай. Давайте удалим это обсуждение, поскольку оно устарело. - person ; 18.07.2016

Возможно, у вас возникнет путаница, которую делают и gcc, и clang. Чтобы скомпилировать код как C++, вы должны использовать g++ вместо gcc, соответственно clang++ вместо clang.

Я сомневаюсь, что сами библиотеки libc++ отсутствуют, так как почти наверняка какая-то программа зависит от них.

person Paul Stelian    schedule 18.07.2016
comment
Ну, это про настройку самого компилятора. cmake может вызывать clang вместо clang++ внутри, но я думаю, что у него должна быть какая-то переменная для установки компилятора (у самого make она есть) - person Paul Stelian; 18.07.2016
comment
Я бы удивился, если бы библиотеки не было. Gcc должен иметь возможность подключиться к этой библиотеке, если будет указано. - person Paul Stelian; 18.07.2016
comment
...удаление комментариев и голосование против - совершенно невежливо! Ржунимагу - person Paul Stelian; 18.07.2016