Форум программистов, компьютерный форум, киберфорум
C/C++: IDE, инструментарий
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.52/21: Рейтинг темы: голосов - 21, средняя оценка - 4.52
120 / 4 / 1
Регистрация: 15.06.2016
Сообщений: 236

Компиляция *.cpp компилятором gcc

30.12.2018, 01:23. Показов 4671. Ответов 31
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Недавно столкнулся с проблемой отсутствия библиотеки libgcc_s_dw2-1.dll (виртуалка с чистой виндой). Начал копаться и обнаружил, что , эта проблема свойственна только x86 компилятору(я использую mingw-w64). Файл, скомпилированный при помощи x64 компилятора(тож mingw-w64) запускается на ура. Что еще более странно, это,что если скомпилировать исходники компилятором gcc x86, а не g++ x86(пишу на плюсах), то ошибка пропадает. Пишу, чтобы вы помогли разобраться в этих аномалиях.Не люблю, когда что-то недопонимаю
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.12.2018, 01:23
Ответы с готовыми решениями:

После установки Dev-Cpp 5.11 TDM-GCC 4.9.2 Setup.exe дает ошибку Exception elinifileexpectation in module devcpp․exe
Ошибка- Exception elinifileexpectation in module devcpp․exe at 0004B209 Unable to write to C:\Dev-Cpp\config\devcpp.ini

Компиляция проекта в gcc
Здравствуйте, форумчане! Прошу помочь разобраться! Есть программа, представленная в 3х файлах. В первом содержится описание класса...

Непонятные проблемы с компилятором gcc
Всем привет ! Вчера делал много настроек на сервере - и незнаю может сбил что-то или что удалил но вроде все далал с умомо , ...

31
120 / 4 / 1
Регистрация: 15.06.2016
Сообщений: 236
04.01.2019, 00:17  [ТС]
Что же все-таки произойдет , если скомпилировать c++ исходники компилятором gcc?
0
415 / 150 / 48
Регистрация: 02.06.2016
Сообщений: 364
04.01.2019, 08:28
Цитата Сообщение от GreyCat Посмотреть сообщение
Файл, скомпилированный при помощи x64 компилятора(тож mingw-w64) запускается на ура.
Если это та же система на которой установлен компилятор. возможно у вас прописан путь до компилятора в переменных окружения.
Цитата Сообщение от GreyCat Посмотреть сообщение
Начал копаться и обнаружил, что , эта проблема свойственна только x86 компилятору
Попробуйте ключ -static включить
1
120 / 4 / 1
Регистрация: 15.06.2016
Сообщений: 236
04.01.2019, 22:04  [ТС]
Цитата Сообщение от GoshaM Посмотреть сообщение
Если это та же система на которой установлен компилятор. возможно у вас прописан путь до компилятора в переменных окружения.
Компиляторы настроены в ide(qt creator).Есть возможность выбрать определенный компилятор.

Цитата Сообщение от GoshaM Посмотреть сообщение
Попробуйте ключ -static включить
Действительно помогло. Теперь программа, скомпилированная g++(x86) запускается на чистой системе без ошибок.Размер исполняемого файла УМЕНЬШИЛСЯ на 512 байт.Почему так? static ведь прикрепляет доп модули к исполняемому файлу, а не наоборот. Пожалуйста разъясните))

Добавлено через 7 часов 59 минут
Все это свойственно пустому проекту. В реальном проекте опция -static увеличивает размер файла в несколько раз.Опять же, если скомпилировать c++ исходники компилятором gcc(x86), получим файл маленького размера и при том все запускается без ошибок. Почему так происходит?
0
415 / 150 / 48
Регистрация: 02.06.2016
Сообщений: 364
05.01.2019, 02:26
Не компилирует у меня gcc простейший cpp код. На разных версиях пробовал.
1
120 / 4 / 1
Регистрация: 15.06.2016
Сообщений: 236
05.01.2019, 16:44  [ТС]
у меня компилятор mingw-w64.Все компилирует)
0
415 / 150 / 48
Регистрация: 02.06.2016
Сообщений: 364
05.01.2019, 17:20
У меня тоже MinGW-W64 GCC-8.1.0 отсюда
1
120 / 4 / 1
Регистрация: 15.06.2016
Сообщений: 236
06.01.2019, 12:03  [ТС]
Странно..
0
415 / 150 / 48
Регистрация: 02.06.2016
Сообщений: 364
06.01.2019, 12:08
Вот тема. С ключом -lstdc++ собирается, но размер такой же как и при cборке g++.
1
120 / 4 / 1
Регистрация: 15.06.2016
Сообщений: 236
06.01.2019, 15:10  [ТС]
Не, это не то. Пробовал опцию -lstdc++, ничего не поменялось, даже размер исполняемого файла не изменился.
Вы мне скажите: почему размеры файлов , скомпилированных с помощью gcc и g++ разнятся. Как я понял разница в обоих случаях лишь в линковке. Или что еще?
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
07.01.2019, 19:39
Цитата Сообщение от GreyCat Посмотреть сообщение
Опять же, если скомпилировать c++ исходники компилятором gcc(x86)
Gcc и c++

Добавлено через 2 минуты
Цитата Сообщение от GreyCat Посмотреть сообщение
Вы мне скажите: почему размеры файлов , скомпилированных с помощью gcc и g++ разнятся
Я думаю здесь надо на код посмотреть, который вы собираете. Это код на Си или на C++?
1
415 / 150 / 48
Регистрация: 02.06.2016
Сообщений: 364
07.01.2019, 20:08
Цитата Сообщение от DrOffset Посмотреть сообщение
Сишный компилятор - это сс
В MinGW это тоже так? Я что-то никакого сс не вижу.
1
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
07.01.2019, 21:07
Цитата Сообщение от GoshaM Посмотреть сообщение
В MinGW это тоже так?
Да.

Цитата Сообщение от GoshaM Посмотреть сообщение
Я что-то никакого сс не вижу.
Может быть не там смотрите.

Добавлено через 10 минут
Цитата Сообщение от GoshaM Посмотреть сообщение
В MinGW это тоже так?
Хотя видимо вы правы, в чистом MinGW похоже нет отдельного cc.exe. Но он присутствует в MSYS2.
Посмотреть какие конкретно программы вызывает gcc именно в вашем случае можно добавив при компиляции ключ -v (verbose).

Добавлено через 3 минуты
У меня, например, вот так:
Code
1
2
3
4
5
6
7
8
9
10
$ gcc ./test.c -v
Using built-in specs.
COLLECT_GCC=E:\Develop\MSYS\mingw64\bin\gcc.exe
COLLECT_LTO_WRAPPER=E:/Develop/MSYS/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/8.2.0/lto-wrapper.exe
Target: x86_64-w64-mingw32
Configured with: ../gcc-8.2.0/configure --prefix=/mingw64 --with-local-prefix=/mingw64/local --build=x86_64-w64-mingw32 --host=x86_64-w64-mingw32 --target=x86_64-w64-mingw32 --with-native-system-header-dir=/mingw64/x86_64-w64-mingw32/include --libexecdir=/mingw64/lib --enable-bootstrap --with-arch=x86-64 --with-tune=generic --enable-languages=ada,c,lto,c++,objc,obj-c++,fortran --enable-shared --enable-static --enable-libatomic --enable-threads=posix --enable-graphite --enable-fully-dynamic-string --enable-libstdcxx-filesystem-ts=yes --enable-libstdcxx-time=yes --disable-libstdcxx-pch --disable-libstdcxx-debug --disable-isl-version-check --enable-lto --enable-libgomp --disable-multilib --enable-checking=release --disable-rpath --disable-win32-registry --disable-nls --disable-werror --disable-symvers --with-libiconv --with-system-zlib --with-gmp=/mingw64 --with-mpfr=/mingw64 --with-mpc=/mingw64 --with-isl=/mingw64 --with-pkgversion='Rev1, Built by MSYS2 project' --with-bugurl=https://sourceforge.net/projects/msys2 --with-gnu-as --with-gnu-ld
Thread model: posix
gcc version 8.2.0 (Rev1, Built by MSYS2 project)
COLLECT_GCC_OPTIONS='-v' '-mtune=generic' '-march=x86-64'
 E:/Develop/MSYS/mingw64/lib/gcc/x86_64-w64-mingw32/8.2.0/cc1.exe -quiet -v -iprefix E:/Develop/MSYS/mingw64/lib/gcc/x86_64-w64-mingw32/8.2.0/ -D_REENTRANT ./test.c -quiet -dumpbase test.c -mtune=generic -march=x86-64 -auxbase test -version -o E:\Develop\MSYS\tmp\ccFPtr7Z.s
Здесь видно, что gcc на самом деле вызывает компилятор cc1.exe для файла с расширением *.с
Вот тоже самое, но для файла cpp (вызывается cc1plus.exe):
Code
1
2
3
4
5
6
7
8
9
10
$ gcc ./test.cpp -v
Using built-in specs.
COLLECT_GCC=E:\Develop\MSYS\mingw64\bin\gcc.exe
COLLECT_LTO_WRAPPER=E:/Develop/MSYS/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/8.2.0/lto-wrapper.exe
Target: x86_64-w64-mingw32
Configured with: ../gcc-8.2.0/configure --prefix=/mingw64 --with-local-prefix=/mingw64/local --build=x86_64-w64-mingw32 --host=x86_64-w64-mingw32 --target=x86_64-w64-mingw32 --with-native-system-header-dir=/mingw64/x86_64-w64-mingw32/include --libexecdir=/mingw64/lib --enable-bootstrap --with-arch=x86-64 --with-tune=generic --enable-languages=ada,c,lto,c++,objc,obj-c++,fortran --enable-shared --enable-static --enable-libatomic --enable-threads=posix --enable-graphite --enable-fully-dynamic-string --enable-libstdcxx-filesystem-ts=yes --enable-libstdcxx-time=yes --disable-libstdcxx-pch --disable-libstdcxx-debug --disable-isl-version-check --enable-lto --enable-libgomp --disable-multilib --enable-checking=release --disable-rpath --disable-win32-registry --disable-nls --disable-werror --disable-symvers --with-libiconv --with-system-zlib --with-gmp=/mingw64 --with-mpfr=/mingw64 --with-mpc=/mingw64 --with-isl=/mingw64 --with-pkgversion='Rev1, Built by MSYS2 project' --with-bugurl=https://sourceforge.net/projects/msys2 --with-gnu-as --with-gnu-ld
Thread model: posix
gcc version 8.2.0 (Rev1, Built by MSYS2 project)
COLLECT_GCC_OPTIONS='-v' '-mtune=generic' '-march=x86-64'
 E:/Develop/MSYS/mingw64/lib/gcc/x86_64-w64-mingw32/8.2.0/cc1plus.exe -quiet -v -iprefix E:/Develop/MSYS/mingw64/lib/gcc/x86_64-w64-mingw32/8.2.0/ -D_REENTRANT ./test.cpp -quiet -dumpbase test.cpp -mtune=generic -march=x86-64 -auxbase test -version -o E:\Develop\MSYS\tmp\ccdQdA8i.s
Добавлено через 19 минут
Да, все-таки в обычном MinGW нет отдельного сс. Но в корне это ничего не меняет, принцип остается тем же. Что MinGW-шный GCC, что UNIX-совый CC при передаче им файла *.c вызывают непосредственно компилятор cc1 (или cc1.exe для MinGW).
Для MinGW w64 он должен лежать по пути похожему на вот такой: <каталог mingw>\libexec\gcc\x86_64-w64-mingw32\<версия>\.
2
120 / 4 / 1
Регистрация: 15.06.2016
Сообщений: 236
07.01.2019, 21:24  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Я думаю здесь надо на код посмотреть, который вы собираете. Это код на Си или на C++?
код c++
C++
1
2
3
4
5
6
#include <stdio.h>
int main()
{
    printf("Hello world");
    return 0;
}
Эту программу скомпилировал разными компиляторами с разными опциями.Можете попробовать запустить каждый экземпляр, предварительно удалив с PATH путь до компилятора, чтобы сымитировать запуск на чистой системе.P010_research1.rar
0
120 / 4 / 1
Регистрация: 15.06.2016
Сообщений: 236
07.01.2019, 21:40  [ТС]
Лично у меня запускается все, кроме g++(x86),где, собственно появляется ошибка отсутствия библиотеки libgcc_s_dw2-1.dll

Добавлено через 12 минут
Цитата Сообщение от DrOffset Посмотреть сообщение
Для MinGW w64 он должен лежать по пути похожему на вот такой: <каталог mingw>\libexec\gcc\x86_64-w64-mingw32\<версия>\.
Да, таки есть, проверил. Опция -v дала понять, что gcc вызывает cc1plus.exe. Значит дело в линковке?
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
07.01.2019, 21:43
Цитата Сообщение от GreyCat Посмотреть сообщение
собственно появляется ошибка отсутствия библиотеки libgcc_s_dw2-1.dll
Ну так а сам этот файл у вас есть в составе mingw?
1
120 / 4 / 1
Регистрация: 15.06.2016
Сообщений: 236
07.01.2019, 22:43  [ТС]
есть. Лежит тут C:\Program Files (x86)\mingw-w64\i686-8.1.0-posix-dwarf-rt_v6-rev0\mingw32\i686-w64-mingw32\lib
А если появится нужда запустить программу на другой системе, на которой нет mingw и следовательно этой либы? Тащить ее с собой тоже не разумно, потому что есть другой вариант: скомпилировать этот же код с помощью gcc. Не знаю что там происходит, но проблема исчезает, да и к тому же размер исполняемого файла уменьшается примерно на 1 кб. Очень странно.Это я и пытаюсь разобрать подробно. Почему так происходит.

Добавлено через 4 минуты
Цитата Сообщение от DrOffset Посмотреть сообщение
Ну так а сам этот файл у вас есть в составе mingw?
Когда я писал что появлялась ошибка, я имел ввиду запуск на абсолютно чистой виртуалке.
0
415 / 150 / 48
Регистрация: 02.06.2016
Сообщений: 364
07.01.2019, 23:06
Цитата Сообщение от GreyCat Посмотреть сообщение
Очень странно.
Теперь как раз все понятно.
Напишите так и все станет на свои места:
C++
1
2
3
4
5
6
7
8
9
#include <iostream>
 
using namespace std;
 
int main()
{
    cout << "Hello world!" << endl;
    return 0;
}
1
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
07.01.2019, 23:11
Цитата Сообщение от GreyCat Посмотреть сообщение
А если появится нужда запустить программу на другой системе, на которой нет mingw и следовательно этой либы? Тащить ее с собой тоже не разумно
На самом деле это нормально. Компоновка нужных библиотек входит в типичный процесс деплоя приложения.

Цитата Сообщение от GreyCat Посмотреть сообщение
скомпилировать этот же код с помощью gcc. Не знаю что там происходит, но проблема исчезает, да и к тому же размер исполняемого файла уменьшается примерно на 1 кб. Очень странно
Я же сказал вам, что нужно посмотреть на код, который вы собираете.
libgcc_s очевидно идет зависимостью к libstdc++ (ключ линковки, который вы указывали -lstdc++, подключает именно ее), которую подключает по умолчанию g++. Если ваш код на самом деле не требует libstdс++, то получается, что убрав ее из зависимостей, вы избавились и от libgcc_s. Целиком и полностью все зависит от того кода, который вы компилируете.
1
120 / 4 / 1
Регистрация: 15.06.2016
Сообщений: 236
08.01.2019, 00:24  [ТС]
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
D:\Documents\CPlusPlus\P010_research1>"C:\Program Files (x86)\mingw-w64\i686-8.1
.0-posix-dwarf-rt_v6-rev0\mingw32\bin\gcc" main.cpp -o gcc(x86).exe
C:\Users\admin\AppData\Local\Temp\cc8wwhYi.o:main.cpp:(.text+0x21): undefined re
ference to `std::cout'
C:\Users\admin\AppData\Local\Temp\cc8wwhYi.o:main.cpp:(.text+0x26): undefined re
ference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <
std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, cha
r const*)'
C:\Users\admin\AppData\Local\Temp\cc8wwhYi.o:main.cpp:(.text+0x2d): undefined re
ference to `std::basic_ostream<char, std::char_traits<char> >& std::endl<char, s
td::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)'
C:\Users\admin\AppData\Local\Temp\cc8wwhYi.o:main.cpp:(.text+0x34): undefined re
ference to `std::ostream::operator<<(std::ostream& (*)(std::ostream&))'
C:\Users\admin\AppData\Local\Temp\cc8wwhYi.o:main.cpp:(.text+0x54): undefined re
ference to `std::ios_base::Init::~Init()'
C:\Users\admin\AppData\Local\Temp\cc8wwhYi.o:main.cpp:(.text+0x75): undefined re
ference to `std::ios_base::Init::Init()'
collect2.exe: error: ld returned 1 exit status


Добавлено через 5 минут
с флагом -lstdc++ ошибок нет
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.01.2019, 00:24
Помогаю со студенческими работами здесь

Учим code::blocks компилировать gcc компилятором
не умею пользоваться форумом, переместите в нужную ветку если не туда попал в общем те кто пользуются кодблоксом знают что он С/С++ ...

как скомпилировать исходник на Python компилятором gcc?
Друзья! Знает кто-нибудь? А то в инете нет ничё, какие-то скрипты, интерпретаторы... Просто я в книге по GCC прочёл: &quot;...друrие...

Как записать компиляцию файла С в cgi компилятором gcc?
Добрый день! Вопрос такой. Как скомпилировать в gcc файл c в cgi в Убунту. Если прописать gcc путь/script.c компиляция...

Можно ли компилятором gcc создать COM объекты, сервер, в частности?
По-моему, нет. Ведь в сервере среди всего прочего надо реализовывать метод объекта QueryInterface. Он может запросто принять первым...

Как осуществляется компиляция и компоновка программы со строковым компилятором?
Можете ответить подробно на этот вопрос.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru