C ++ 11 с gcc 4.6.1 на Mac - PullRequest
       25

C ++ 11 с gcc 4.6.1 на Mac

6 голосов
/ 24 августа 2011

Я новичок в Mac и пытаюсь заставить работать gcc 4.6.

Я установил MacPorts и установил gcc 4.6.1 (выполнив sudo port install gcc46).Я пытаюсь скомпилировать простой тестовый код, который прекрасно компилируется в Linux (с gcc 4.6.1 и 4.6.2) и Windows, но я получаю ошибки, из-за которых у меня возникают проблемы с установленными библиотеками.

#include <iostream>
#include <type_traits>
#include <future>

struct test {
    void get() {}
};

/*template<typename Func>
test async(const Func &f) {
    f();
    return test();
}*/

using namespace std;

int main (int argc, const char * argv[])
{
    auto t1 = async([]() -> int{
        cout << "This is thread 1" << endl;
        return 1;
    });

    auto t2 = async([]() -> int {
        cout << "This is thread 2" << endl;
        return 2;
    });

    std::cout << "This is the main thread" << endl;

    t1.get();
    t2.get();

    return 0;
}

Сообщения об ошибках:

macbook01:Test fozi$ g++ main.cpp -o test -std=c++0x
main.cpp: In function 'int main(int, const char**)':
main.cpp:30:6: error: invalid use of incomplete type 'std::enable_if<true, std::future<int> >::type'
/opt/local/include/gcc46/c++/future:111:11: error: declaration of 'std::enable_if<true, std::future<int> >::type'
main.cpp:30:6: error: unable to deduce 'auto' from '<expression error>'
main.cpp:35:6: error: invalid use of incomplete type 'std::enable_if<true, std::future<int> >::type'
/opt/local/include/gcc46/c++/future:111:11: error: declaration of 'std::enable_if<true, std::future<int> >::type'
main.cpp:35:6: error: unable to deduce 'auto' from '<expression error>'
/opt/local/include/gcc46/c++/future: At global scope:
/opt/local/include/gcc46/c++/future:150:5: error: 'typename std::enable_if<(! std::is_same<typename std::decay<_Functor>::type, std::launch>::value), std::future<decltype (declval<_Fn>()((declval<_Args>)()...))> >::type std::async(_Fn&&, _Args&& ...) [with _Fn = main(int, const char**)::<lambda()>, _Args = {}, typename std::enable_if<(! std::is_same<typename std::decay<_Functor>::type, std::launch>::value), std::future<decltype (declval<_Fn>()((declval<_Args>)()...))> >::type = std::future<int>]', declared using local type 'main(int, const char**)::<lambda()>', is used but never defined [-fpermissive]
/opt/local/include/gcc46/c++/future:150:5: error: 'typename std::enable_if<(! std::is_same<typename std::decay<_Functor>::type, std::launch>::value), std::future<decltype (declval<_Fn>()((declval<_Args>)()...))> >::type std::async(_Fn&&, _Args&& ...) [with _Fn = main(int, const char**)::<lambda()>, _Args = {}, typename std::enable_if<(! std::is_same<typename std::decay<_Functor>::type, std::launch>::value), std::future<decltype (declval<_Fn>()((declval<_Args>)()...))> >::type = std::future<int>]', declared using local type 'main(int, const char**)::<lambda()>', is used but never defined [-fpermissive]

Обратите внимание, что если я использую мою фиктивную асинхронную функцию, она компилируется и работает нормально.

Я застрял, могу ли янужно установить конкретную библиотеку (версию)?Как мне это сделать?

Ответы [ 3 ]

5 голосов
/ 27 сентября 2011

У меня были похожие проблемы с gcc-4.6.1 и OS X 10.6. Проблема в том, что поток C ++ 0x в настоящее время не поддерживается в OS X.

Смотрите это сообщение: c ++ 0x, std :: ошибка потока (тема не является членом std)

Если вы загляните в файл заголовка "$ {prefix} / include / c ++ / 4.6.1 / future", вы увидите строку:

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

К сожалению, _GLIBCXX_HAS_GTHREADS преобразуется в 0 в OS X.

3 голосов
/ 27 марта 2012

Мы туда доберемся

gcc 4.7 (порт) компилирует этот код просто отлично.

Xcode 4.3 поставляется с clang 3.1, который должен поддерживать это, но он падает, когда я пытаюсь скомпилировать. Однако я собрал clang из SVN и заменил компилятор, который использует XCode, и теперь он также компилируется и работает нормально.

И это заняло всего полгода.

0 голосов
/ 13 сентября 2011

Попробуйте g++ -v, чтобы получить версию G ++, которую вы используете. Я не использую предварительно скомпилированный компилятор, но, возможно, это то же самое для вас.

GCC 4.6.0 устанавливается в /usr/local/bin под именем x86_64-apple-darwin10.7.0-g++

Если вы все еще используете простую команду g ++, она все равно может быть /usr/bin/g++, что является разновидностью Apple llvm-gcc.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...