std :: thread в MacPorts gcc4.5 - PullRequest
       26

std :: thread в MacPorts gcc4.5

10 голосов
/ 16 декабря 2010

Я пытаюсь скомпилировать какое-то программное обеспечение, которое я пишу для Linux, которое использует некоторые необычные новые функции C ++ 0x на моем Mac.Я использовал MacPorts для установки пакета gcc45, который дал мне /opt/local/bin/g++-mp-4.5, однако этот компилятор не хочет ничего компилировать в <thread>.Например, я пытаюсь скомпилировать:

//test.cpp
#include <thread>

int main()
{
std::thread x;
return 0;
}

и получить:

bash-3.2$ /opt/local/bin/g++-mp-4.5 -std=c++0x test.cpp 
test.cpp: In function 'int main()':
test.cpp:5:2: error: 'thread' is not a member of 'std'
test.cpp:5:14: error: expected ';' before 'x'

Быстрый просмотр в / opt / local / include / gcc45 / c ++ / thread показывает, что std :: threadкласс определен, но защищен следующим:

#if defined(_GLIBCXX_HAS_GTHREADS) && defined(_GLIBCXX_USE_C99_STDINT_TR1)

Опять же, это прекрасно работает на моей машине с Ubuntu, так что как правильно включить библиотеку c ++ 0x <thread> в версии MacPortsg ++ 4.5 (g ++ - mp-4.5)?Если это не так, нужно ли мне что-то знать (настраивать флаги и т. Д.), Прежде чем сам приступить к компиляции gcc 4.5?

Обновление: Не похоже, что сообщество SO знает об этоммного об этом, так что, возможно, пришло время немного приблизиться к разработчикам.Кто-нибудь знает официальный список рассылки, на который я мог бы переслать этот вопрос?Есть ли какие-нибудь советы по этикету, которые помогут мне получить ответ?

Обновление 2: Я попросил у SO другое временное решение здесь , и поэтому я просто заменяюбиблиотеки boost :: thread для стандартных.К сожалению, нет повышения :: будущего, так что это еще не совсем полное решение.Любая помощь будет с благодарностью.

Ответы [ 2 ]

8 голосов
/ 15 января 2011

На самом деле <thread> библиотека не работает в Mac OS X, потому что здесь pthreads не имеет некоторых функций с тайм-аутами (например, pthread_mutex_timedlock ()). Доступность этих функций должна быть проверена с использованием макроса _POSIX_TIMEOUTS, но она определена как -1 в Mac OS X 10.4, 10.5 и 10.6 (я не знаю, что насчет 10.7), и эти функции действительно отсутствует в pthread.h.

Макрос _POSIX_TIMEOUTS проверяется во время настройки libstdc ++. Если проверка завершается успешно, _GLIBCXX_HAS_GTHREADS макрос становится определенным. И <thread> содержимое становится доступным с -std=c++0x.

libstdc ++ действительно нужен _POSIX_TIMEOUTS например. в реализации класса std::timed_mutex (см. заголовок <mutex>).

Подводя итог, я думаю, что <thread> станет доступным в Mac OS X, когда gthreads GCC или libstdc ++ будут реализовывать эмуляцию pthread_mutex_timedlock () (и другие) или когда эти функции будут реализованы в Mac OS X.

Или, возможно, в будущем стандарте C ++ появится способ запрашивать языковые функции (например, это синхронизированные функции и классы), и будет возможно собрать libstdc ++ с отключенными этими функциями. Однако я не очень знаком с будущим стандартом и сомневаюсь в этой функции.

5 голосов
/ 09 марта 2012

Обновление - gcc4.7 теперь позволяет компилировать в OS X: Смотрите здесь

...