LINUX.ORG.RU
ФорумTalks

gcc 11

 


0

3

в новом gcc стандартом по дефолту стал c++-17. вангую много гемора и полыхания задниц мейнтейнерам различного софта, писанного на крестах

★★★★★

с чего бы вдруг?

Весь нормальный софт пишется с указанием конкретного стандарта в сборочной системе. Дефолт никто не использует, так как он меняется от версии к версии.

fsb4000 ★★★★★
()
Ответ на: комментарий от fsb4000

Это классно, когда весь софт нормальный. Вот только в жизни это не совсем так

ananas ★★★★★
() автор топика

Когда дефолтом стал C++11, я лично никаких проблем не заметил с «различным» софтом.

Быть может мейнтейнеры расскажут больше, но тем не менее.

a1batross ★★★★★
()

Перекатывался когда-то с 11 на 17 без проблем. Трабла была с перекатыванием с 17 на 20, где для юникода отдельный тип появился, который не кастится неявно в char

SR_team ★★★★★
()
Ответ на: комментарий от SR_team

Ну, эта веселуха в 12-м будет

ananas ★★★★★
() автор топика

Лучше бы написали про Федору 34. За что Редхат платит деньги, почему его агенты не сделают новость?

Im_not_a_robot ★★★★★
()
Ответ на: комментарий от ananas

Писать на С/C++ без -Werror – искать неприятностей.

Siborgium ★★★★★
()

А что там может отвалиться глобально ? Какие-то сильно ломающие изменения есть ? А то у меня в относительно НОРМАЛЬНО написанном софте никаких проблем не было вообще при переезде с C++11 -> С++14 -> С++17 в течении пары месяцев.

А так да, есть куча говнософта (в том числе опенсурсного) которая хрен пойми как вообще ещё собирается без фатальных ошибок, лигейси всякое там. С этим, конечно, будет куча проблем.

DawnCaster ★★
()
Последнее исправление: DawnCaster (всего исправлений: 1)

На днях попытался пересобрать весь устновленный софт из портов на FreeBSD 13 вместо штатного LLVM/Clang 11.0.1 новым GCC 11. В общем получилось не всё, но без нескольких версий LLVM сейчас не обойтись 100%.

iZEN ★★★★★
()
Ответ на: комментарий от ananas

Не, но вина за это целиком и полностью на тех, кто впихивает его куда ни попадя.

Darth_Revan ★★★★★
()

Явно прописать один ключ это овер задача?

BceM_IIpuBeT ★★☆☆☆
()
Ответ на: Починил. от Darth_Revan

Про других не знаю.

grem ★★★★★
()

Во FreeBSD шланг с 17 стандартом по умолчанию приехал уже больше года назад. Ничего ни у кого не полыхало. Ну сломалось пара десятков портов, чему-то просто добавили старый -std в флаги компилятора, что-то запатчили, что-то пометили на удаление. Это элементарные операции.

slovazap ★★★★★
()
Ответ на: комментарий от slovazap

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

ananas ★★★★★
() автор топика
Ответ на: комментарий от ananas

эти элементарные операции зачастую изрядно бесят и вызывают тонны ненависти

Не скажу за непрофессиональный шлак, но у нормальных мантейнеров нет, не вызывают.

slovazap ★★★★★
()
Ответ на: комментарий от ananas

эти элементарные операции зачастую изрядно бесят и вызывают тонны ненависти

А это зря. Неодушевленную вещь ненавидеть смысла нет, а других людей за что, если они свою работу делают… Они тебе лично вредят что ли?

seiken ★★★★★
()
Ответ на: комментарий от luke

Модули завезли.

В msys2, Manjaro и Debian пока лишь gcc 10 :(

Если у тебя уже появился gcc 11, можешь попробовать модули?

Как будет выглядеть строка компиляции для такого примера?

import <iostream>;

int main()
{
    std::cout << "Hello modules!\n";
    return 0;
}

Для Visual Studio 2019 16.10 Preview 2 это выглядит так:

cl /EHsc /nologo /W4 /std:c++latest /MD  /exportHeader /headerName:angle iostream /Fo:iostream.obj


cl /EHsc /nologo /W4 /std:c++latest /MD /headerUnit:angle "iostream=iostream.ifc" main.cpp iostream.obj

clang 12 всё ещё не поддерживает модули и импорт стандартных библиотек.

gcc 11.1 должен поддерживать, но точная строка компиляции бы не помешала…

вторая строка наверное выглядит так

g++ -std=c++20 -fmodules-ts main.cpp

а как скомпилировать модуль iostream?

https://gcc.godbolt.org/z/e41rrW4Mn

fsb4000 ★★★★★
()
Последнее исправление: fsb4000 (всего исправлений: 2)
Ответ на: комментарий от fsb4000

std:: пока увы нельзя как модули использовать

Я сегодня вот так вот на Slackware64-curren, собрав gcc 11.1.0, поэкспериментировал:

[luke@yaviniv modules-test]$ ls
hello.cpp  main.cpp
[luke@yaviniv modules-test]$ cat hello.cpp 
module;
#include <iostream>
#include <string_view>
export module hello;
export void greeter (std::string_view const &name)
{
  std::cout << "Hello " << name << "!\n";
}
[luke@yaviniv modules-test]$ cat main.cpp 
import hello;
int main (void)
{
  greeter ("world");
  return 0;
}
[luke@yaviniv modules-test]$ g++ -std=c++20 -fmodules-ts hello.cpp main.cpp -o modules_01
[luke@yaviniv modules-test]$ ./modules_01 
Hello world!
[luke@yaviniv modules-test]$ ls
gcm.cache  hello.cpp  main.cpp	modules_01
[luke@yaviniv modules-test]$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/home/luke/pkg/gcc-11.1.0/libexec/gcc/x86_64-pc-linux-gnu/11.1.0/lto-wrapper
Target: x86_64-pc-linux-gnu
Configured with: ../src/configure --prefix=/home/luke/pkg/gcc-11.1.0 --disable-multilib
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 11.1.0 (GCC)

Здесь вроде как подробнее описано: https://gcc.gnu.org/wiki/cxx-modules

luke ★★★★★
()
Последнее исправление: luke (всего исправлений: 1)
Ответ на: комментарий от luke

std:: пока увы нельзя как модули использовать

В С++20 и gcc 11 можно просто где-то в доках запрятано…

Вот предложение которое включено в стандарт:

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1502r1.html

А в gcc wiki написано:

https://gcc.gnu.org/wiki/cxx-modules

Mar 26th 2020 - All STL headers work as header units, (except <ranges> in C++20 mode) 
Apr 7th 2020 - C++20 <ranges> as a header unit 

Ладно, надеюсь в Manjaro скоро появится gcc 11.

Я как научусь собирать, то напишу здесь…

fsb4000 ★★★★★
()
Ответ на: комментарий от fsb4000

Я как научусь собирать, то напишу здесь…

wget http://mirror.linux-ia64.org/gnu/gcc/releases/gcc-11.1.0/gcc-11.1.0.tar.xz
tar xvf gcc-11.1.0.tar.xz
cd gcc-11.1.0
./contrib/download_prerequisites
./configure --prefix=${HOME}/pkg/gcc-11.1.0
make -jX
make install
echo 'PATH=${HOME}/pkg/gcc-11.1.0/bin:${PATH}' >> ${HOME}/.bash_profile
echo 'LD_LIBRARY=${HOME}/pkg/gcc-11.1.0/lib64:${LD_LIBRARY_PATH}' >> ${HOME}/.bash_profile

Примерно как-то так. Я ещё мультилиб отключал.

luke ★★★★★
()
Ответ на: комментарий от luke

в debian подключил experimental, там gcc-11 есть (надеюсь потом нормально получится вернуть всё как было :))

Всё. Научился собирать любой стандартный заголовок в gcc 11.1

import <iostream>;

int main()
{
    std::cout << "Hello modules!\n";
    return 0;
}
g++ -std=c++20 -fmodules-ts -x c++-header /usr/include/c++/11/iostream

g++ -std=c++20 -fmodules-ts main.cpp -o hello

https://i.imgur.com/Y0gR8p7.png

Единственно абсолютный путь до заголовочных файлов немного напрягает, но я не нашёл пока ничего другого…

fsb4000 ★★★★★
()
Последнее исправление: fsb4000 (всего исправлений: 1)
Ответ на: комментарий от fsb4000

-x c++-header /usr/include/c++/11/iostream

Круто! Я доку не долистал до конца(

luke ★★★★★
()

Я уже наткнулся не так давно на приколы при компиляции софта родом из далеких восьмидесятых! Gcc упорото пытался его в стиле C99 компилять, пришлось флажочки добавлять, чтобы не было беспочвенных варнингов.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от luke

Ну, здесь-то хоть адекватно все будет. А я вот пару лет назад попытался RTS2 собрать восьмым gcc. Да еще и выставил принудительно -Werror -Wall -Wextra. За два дня все косяки в коде исправил (а кода там прилично). Отослал автору пулриквест.

Угадай, что написал автор!? Он сказал, что свою поделку писал для старого железа и ему насрать на мой восьмой gcc, т.к. он компиляет исключительно или gcc3, или максимум gcc4.2!!!1111

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от luke

А я как-то шланг натравил на свой говнокод. Ух, и удивился ☺

В общем, надо потихоньку на шланг переходить. А еще было бы неплохо, если б буржуи, разрабатывающие PVS, открыли бы его код! Ну или хотя бы оставили огороженным, но фриварным.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от luke

Модули завезли.

Не прошло и… 55 лет с момента представления Н.Виртом языка программирования Modula…

Версию Turbo Pascal с модулями все помнят? Turbo Pascal v.4.0, 1987 год…

Компиляция модулей Паскаля

В среде Турбо Паскаль имеются средства, управляющие способом компиляции модулей и облегчающие разработку больших программ. Определены три режима компиляции: COMPILE , MAKE , BUILD. Режимы отличаются способом связи компилируемого модуля или основной программы с другими модулями, объявленными в предложении USES .

При компиляции модуля или основной программы в режиме COMPILE все, упоминаемые в предложении USES модули, должны быть предварительно откомпилированы, и результаты компиляции должны быть помещены в одноименные файлы с расширением TPU (от англ. Turbo Pascal Unit). Файл с расширением TPU создается автоматически при компиляции модуля Паскаля.

В режиме MAKE компилятор проверяет наличие TPU -файлов для каждого объявленного модуля. Если какой-либо файл не найден, система ищет одноименный файл с расширением PAS , т.е. файл с исходным текстом модуля Паскаля. Если таковой файл найден, система приступает к его компиляции. Кроме того, в этом режиме система следит за возможными изменениями исходного текста любого используемого модуля. Если в PAS -файл внесены изменения, то независимо от того, есть ли в каталоге соответствующий TPU -файл или нет, система откомпилирует его перед компиляцией основной программы. Более того, если изменения внесены в интерфейсную часть, то будут откомпилированы все другие модули, обращающиеся к нему. Режим MAKE существенно облегчает процесс разработки крупных программ с множеством модулей Паскаля: программист избавляется от необходимости следить за соответствием TPU -файлов их исходному тексту, т.к. система делает это автоматически.

В режиме BUILD существующие TPU -файлы игнорируются, система пытается отыскать и откомпилировать соответствующие PAS - файлы для каждого модуля Паскаля. После компиляции можно быть уверенным, что учтены все сделанные в текстах модулей Паскаля исправления и изменения.

Подключение модулей Паскаля к основной программе и их компиляция происходит в порядке их объявления в предложении USES . При переходе к очередному модулю Паскаля система предварительно ищет все модули, на которые он ссылается. Ссылки модулей Паскаля друг на друга могут образовывать древовидную структуру любой сложности, однако запрещается явное или косвенное обращение модуля к самому себе. Но это ограничение можно обойти, если «спрятать» предложение USES в исполняемые части зависимых модулей: дело в том, что Турбо Паскаль разрешает ссылки на частично откомпилированные модули, что приблизительно соответствует опережающему описанию подпрограммы. Если интерфейсные части независимы (это обязательное условие!), Турбо Паскаль сможет идентифицировать все глобальные объекты в каждом модуле, после чего откомпилирует тела модулей обычным способом.

Теперь и на C++ так можно?

iZEN ★★★★★
()
Ответ на: комментарий от iZEN

Я в школе модули на Turbo Pascal 7.1 писал. Но вот объекты уже не хватило ума освоить.

Кстати, в фортране модули тоже есть.

А для плюсов вопрос в том, будет ли autotools поддерживать модули, или надо текать на cmake.

luke ★★★★★
()
Ответ на: комментарий от luke

Я в школе модули на Turbo Pascal 7.1 писал.

Borland Pascal 7.1, 1994 год.

Я начинал с Turbo Pascal 5.5.

Но вот объекты уже не хватило ума освоить.

В Turbo Pascal 5.5 уже были объекты, чем и воспользовался для изучения на i286. Уже тогда в этой среде были игры с динамическим выделением памяти по типизированным указателям типа объекта и деструкторами.

Borland Pascal 7.0, конечно, привнёс в редактор подсветку синтаксиса. А перекрытие окон рабочей среды было уже в Turbo Pascal 6.0 благодаря новой для того времени библиотеке Turbo Vision.

Кстати, в фортране модули тоже есть.

Fortran 90 — стандарт языка FORTRAN, утвержденный в 1992 году и следующий за FORTRAN 77. Опоздал в развии от Pascal-подобных языков очень сильно.

iZEN ★★★★★
()
Ответ на: комментарий от iZEN

Borland Pascal 7.1, 1994 год.

Де-факто стандарт во всех школах вплоть до конца 2000х в отдалённых краях.

В Turbo Pascal 5.5 уже были объекты

Да, я в курсе, просто молод ещё был про объекты и указатели читать.

i286

Вот именно из-за него я перешёл на асм и си, потому что Turbo C 2.0 был более интуитивен, нежели четвёртый (или пятый?) турбик, к тому же хотелось попробовать что-то новое.

Fortran 90 … Опоздал в развии от Pascal-подобных языков очень сильно.

Ну по сравнению с плюсами…

luke ★★★★★
()
Ответ на: комментарий от fsb4000

Ещё б найти, как заставить gcc искать/создавать gcm.cache внутри target… Периодически пытаюсь что-нибудь нагуглить на эту тему – и хрен.

dimgel ★★★★★
()
Ответ на: комментарий от Eddy_Em

А еще было бы неплохо, если б буржуи, разрабатывающие PVS, открыли бы его код! Ну или хотя бы оставили огороженным, но фриварным.

Бесплатные варианты лицензирования PVS-Studio: https://pvs-studio.com/ru/blog/posts/0614/

Andrey_Karpov_2020
()
Последнее исправление: Andrey_Karpov_2020 (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.