2016-12-12 5 views
1

Программа может не скомпилироваться в Cygwin с использованием gcc -std=c++11. Заголовки компилируются ОК (если, например, boost/asio.hpp, они пытаются использовать отсутствующее определение). Теперь, поскольку макросы Cygwin's #ifdef обходят некоторые определения функций в среде C++ 11, программы могут не работать. Этого не происходит, когда одни и те же исходные файлы аналогично компилируются в Fedora Linux.Почему некоторые системные функции не определены в Cygwin при использовании gcc -std = C++ 11?

В этом примере программа не скомпилировать с помощью GCC -std = C++ 11 вариант:

#include <boost/asio.hpp> 
int main() { return 0; } 

я впервые столкнулся с этим, обнаружив, что вышеуказанная программа не компилируется, а затем нашел еще более похожи проблемы при перекомпиляции существующего кода с использованием обновленного стандарта.

Включенные разделы, которые я обнаружил, были разбиты, указаны в ответе.

[редактировать исправить опечатки.]

+0

Почему вы не используете '-std = gnu ++ 11' вместо этого? –

+0

Спасибо @MarkGlisse. Я использовал параметр 'C++ 11', который я нашел в документации. Я не понимал, что существует другой способ указания нового стандарта, пока вы не указали его (ваш метод лучше. Проблема не будет повторяться при обновлении или переустановке boost.) – FNE

ответ

0

Вот обходной путь вы можете использовать до Cygwin включают библиотека обновляется:

В исходном коде, включают в себя

#define _GNU_SOURCE 

перед любым другим включает в себя , Это обходное решение не требуется в Fedora Linux, только в среде Cygwin, а затем только с параметром -std = compiler.

Это исправляет:

#include <boost/asio.hpp> // (Because it uses sigfillset from sys/signal.h) 
#include <sys/signal.h> // sigfillset and others declared nearby 
#include <sys/types.h> // u_int and other __MISC_VISIBLE typedefs 
#include <stdio.h>  // at least fileno 
#include <string.h>  // at least strdup 

и, возможно, других глюков я не обнаружил. Это также может быть исправлена ​​путем простого изменения /usr/include/sys/features.h, добавив

#ifndef _GNU_SOURCE // LOCAL WORK-AROUND 
#define _GNU_SOURCE 
#endif 

ближе к началу файла. Хотя это работает для случайных пользователей библиотеки, это не тот метод, который будут использовать разработчики Cygwin.

+0

_GNU_SOURCE по умолчанию. Зачем использовать 'gcc -std = C++ 11'? Или C или C++, я не понимаю, как вызвать c ompiler со стандартом C++. – matzeri

+0

Оказывается, что ** ** фактически использовал 'C++ -std = C++ 11'. Однако такая же ошибка возникает при использовании gcc, C++ или g ++. Если вы google-компилятор gnu C++, то появляется gcc. Это компилятор C++. – FNE

+0

/usr/bin/gcc и/usr/bin/g ++ - два разных компилятора для двух разных языков. Они связаны, поскольку языки связаны, но не идентичны. Мне непонятно, если вы протестировали или нет без '-std = C++ 11' – matzeri

Смежные вопросы