std::thread в MacPorts gcc4.5

Я пытаюсь скомпилировать некоторое программное обеспечение, которое я писал в 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> в версии MacPorts g++ 4.5 (g++-mp-4.5)? В противном случае, есть ли что-нибудь, что мне нужно знать (настроить флаги и т. д.), прежде чем я приступлю к компиляции gcc 4.5 самостоятельно?

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

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


person rcv    schedule 16.12.2010    source источник
comment
Обновление: я также пробовал версию fink - без костей.   -  person rcv    schedule 16.12.2010
comment
Update2: я также попробовал версию 4.6, скомпилированную из hpc.sourceforge.net/index.php - тоже без кубиков.   -  person rcv    schedule 16.12.2010
comment
Может быть, вы могли бы попробовать скомпилировать с -pthread. В противном случае я не имею ни малейшего представления.   -  person ZachS    schedule 02.01.2011
comment
Ага, это уже пробовал. Спасибо хоть!   -  person rcv    schedule 04.01.2011
comment
Вызывает ли использование ключевого слова decltype ошибку? Это можно использовать, чтобы определить, действительно ли скомпилирована поддержка C++0x.   -  person Gravis    schedule 05.01.2011
comment
decltype работает нормально. Все новые функции основного языка присутствуют и отлично работают, это просто новая часть стандартной библиотеки, которая не компилируется.   -  person rcv    schedule 06.01.2011
comment
Я думаю, вам нужно сделать ссылку на pthreads: -lpthread. Скорее всего это ошибка, потому что GCC должен автоматически линковать стандартные библиотеки!   -  person AraK    schedule 07.01.2011
comment
@AraK - я безуспешно пробовал. Спасибо хоть.   -  person rcv    schedule 07.01.2011


Ответы (2)


На самом деле библиотека <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.

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

person ssmir    schedule 15.01.2011

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

person rcv    schedule 08.03.2012
comment
Точно; MacPorts gcc 4.7.0 компилирует ваш код только -std=c++0x необходимо. Было бы неплохо опубликовать это обновление, чтобы другие пользователи MacOS быстро заработали. - person P Marecki; 26.04.2012