https://en.cppreference.com/w/cpp/compi ... y_features
В настоящее время у нас есть код, который отлично компилируется с помощью gcc и minggw, поскольку они поддерживают libstdc++. Однако мы получаем ошибки при попытке компиляции на более новых системах Mac, особенно при попытке использовать системный clang или системный gcc (который указывает на clang). Например, вот ошибка, которую мы получаем в Ventura 13.6.4 при попытке скомпилировать код, содержащий std::execution::par, с помощью системного gcc или системного clang:
code:
Код: Выделить всё
#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());
}
Код: Выделить всё
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
^~~~~~~~~
Код: Выделить всё
clang -std=c++17 -stdlib=libc++ ...
Код: Выделить всё
no member named 'par' in 'std::exception'
Когда я запустил его с помощью llvm, я получил ту же ошибку компилятора: нет члена с именем par в 'std::excecution'.
Что интересно, что когда я собираю код с помощью 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 используйте политику выполнения, поскольку у них есть доступ к libstdС++ (если я правильно понимаю). По сути, я ищу способ узнать, существует ли std::execution::par. Насколько я понимаю, std::execution::par на самом деле относится к перечислению. Не уверен, что можно просто определить, существует ли перечисление, прежде чем произойдет копиляция. Что вы думаете по этому поводу?
Спасибо!
Подробнее здесь: https://stackoverflow.com/questions/786 ... compilatio