https://en.cppreference.com/w/cpp/compi ... y_features /> В настоящее время у нас есть какой -то код, который хорошо собирает GCC и Minggw, потому что они поддерживали Libstdc ++. Тем не менее, мы получаем ошибки при попытке компиляции с более новыми системами Mac, особенно при попытке использовать системный кланг или системный GCC (который указывает на Clang). Например, вот ошибка, которую мы получаем на Ventura 13.6.4 при попытке скомпилировать какой -то код, содержащий std :: execution :: par with System GCC или System Clang:
код:
Код: Выделить всё
#include
#include
#include
int main(){
std::vector vec = {1, 2, 3, 4, 5, 10, 20, 4 };
std::sort(std::execution::par, vec.begin(), vec.end());
}
< /code>
Моя система Clang - Clang версия 14.0.3. Вот аргумент, который я предоставляю компилятору и полученную ошибку (поместить ... чтобы обозначить длинные компиляторы, которые не важны): < /p>
clang -std=c++17 -stdlib=libstdc++ ...
Код: Выделить всё
clang: warning: include path for libstdc++ headers not found; pass '-stdlib=libc++' on the command line to use the libc++ standard library instead [-Wstdlibcxx-not-found]
: fatal error: 'cstddef' file not found
#include
^~~~~~~~~
< /code>
Когда я изменяю код, чтобы включить Libc ++, я получаю еще одну ошибку (также ставит ... для обозначения длинных аргументов компилятора, которые не важны): < /p>
clang -std=c++17 -stdlib=libc++ ...
< /code>
Ошибка компилятора: < /p>
no member named 'par' in 'std::exception'
Когда я запустил его с LLVM, я получил такую же ошибку компилятора без участника, названного PAR в 'std :: Excection' .
Что интересно, есть Что когда я строю с G ++-13, который я скачал с Homebrew, я могу скомпилировать код. Я обнаружил, что Libstdc ++. Dylib находится в папке LIB для G ++-13, поэтому я думаю, что именно поэтому. Либо он связывается с этим и находит политику выполнения, либо нашла ее в заголовке выполнения, установленном с компилятором. Конкретные компиляторы, используемые в CPP, и определяют пару различных способов построения. Мне любопытно, есть ли способ определить, существует ли политика в заголовке. Например, я видел реализации с __has_include (...)
Код: Выделить всё
#if __has_include()
#include
#define EXECUTION_POLICY
#endif
#ifdef EXECUTION_POLICY
// To use sequential processing, change "par" to "seq".
std::sort(std::execution::par, vec.begin(), vec.end());
#else
// Some compilers have not implemented execution policies.
std::sort(vec.begin(), vec.end());
Я ищу функцию или, возможно, какую-то реализацию, которая будет выглядеть так:
Код: Выделить всё
#look for the execution header
#if the execution header exists, look for 'par'
#if par exists, define EXECUTION_POLICY
#if par does not exist, run the code without the parallel policy
Однако мы хотели бы сохранить возможность старых систем Mac используйте политику выполнения, поскольку у них есть доступ к libstdc++ (если я правильно понимаю). По сути, я ищу способ узнать, существует ли std::execution::par. Насколько я понимаю, std::execution::par на самом деле относится к перечислению. Не уверен, что можно просто определить, существует ли перечисление, прежде чем произойдет копиляция. Что вы думаете по этому поводу?
Спасибо!
Подробнее здесь: https://stackoverflow.com/questions/786 ... compilatio