Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

C++: IDE, инструментарий

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 53, средняя оценка - 4.83
XiloManX
642 / 146 / 31
Регистрация: 11.02.2013
Сообщений: 277
#1

Codeblocks > C++ - C++ IDE

11.02.2013, 20:34. Просмотров 7633. Ответов 52
Метки нет (Все метки)

Привет, всем форумчанам! Решил научиться программировать на C++. Примеры прогамм, пишу в IDE Code::Blocks (компилятор mingw) под Windows.

Как написано в книге по C++, начал с примера "Hello World!", и заметил, что на выходе получается немерянно здоровенный бинарник, размером в 943kB. Я так понял, что к бинарнику подключяются какие-то посторонние функции или вся либа "iostream". И в связи с этим, вопрос. Как сделать так, чтобы подключались только те функции, которые указаны в исходнике? Дело в том, что в Linux'е, этот же пример на C++, весит примерно ~5kB.

C++
1
2
3
4
5
6
7
8
9
#include <iostream>
 
using namespace std;
 
int main()
{
    cout << "Hello world!" << endl;
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.02.2013, 20:34
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Codeblocks > C++ (C++ IDE):

C++ 14 в CodeBlocks - C++ IDE
Делаю примеры из книги Страуструпа. Там используется vector,sort. CodeBlocks не хочет понимать новые версии C++. Как это исправить.Заранее...

CodeBlocks и Unicode - C++ IDE
Здравствуйте!В CodeBlocks стандартная кодировка 1251. Мне нужна Unicode кодировка. В Edit-&gt;File Encoding указываю любую из Unicode...

Ключи CodeBlocks - C++ IDE
Помогите разобраться в секретах быстродействия. Вот у меня есть vector&lt; vector&lt;double&gt; &gt; *Y; Y = new vector&lt; vector&lt;double&gt; &gt;; ...

Настройка отладчика в CodeBlocks - C++ IDE
Здравствуйте, очень хотелось бы получить совет по следующей проблеме, а именно: когда я запускаю отладку файла, то все идет нормально,...

Codeblocks и параметры запуска - C++ IDE
В общем-то столкнулся с проблемой. Не могу найти в C::B, как заставить программу запускаться с нужными параметрами( argv )? Возможно ли...

Странности с wxWidgets и CodeBlocks и с Boost - C++ IDE
Я совсем в программировании новичок. Помогите разобраться. Скачал либы wxWidgets и Boost. Собрал c помощью GCC под windows. ...

52
kravam
быдлокодер
1696 / 883 / 45
Регистрация: 04.06.2008
Сообщений: 5,473
15.02.2013, 04:10 #31
Цитата Сообщение от Toshkarik Посмотреть сообщение
В любой другой папке, отличной от той, в которой исполняемый файл находится сейчас, он, возможно, не запустится.
запустится. Дело в том, что при установке MinGW он запихивает dll-ки в системные директории и по фигу на самом деле, в какой папке находится экзешник.

Но вот на том компе, где MinGW не установлен- там не запустится и тогда -static

Цитата Сообщение от XiloManX Посмотреть сообщение
А что имеется ввиду, под командной строкой? "Build Log" что ли?
ну когда ты тычешь на F9 для компиляции или куда там, запускается файл gcc или g++ с опциями; это наверное не видно, но это не значит, что она нигде не прописана;

В Dev-C++ по звершении компиляции я тычу "Журнал компиляции" и вижу:

Компилятор: Default compiler
Выполнение g++.exe...
g++.exe "E:\vso_moio\Программирование_на_C++\readme\www_crossplatform.ru_node_58\main.cpp" -o "E:\vso_moio\Программирование_на_C++\readme\www_crossplatform.ru_node_58\main.exe" -static -I"E:\Dev_Cpp_nomingw\include" -L"E:\Dev_Cpp_nomingw\lib"
Выполнение завершено
Компиляция успешна
Вот нечто подобное должно быть в твоей IDE;
Тут и видны все ключи и все опции с которыми работал компилятор, даже если они не прописаны явно и можно просмотреть чем отличается компиляция в режиме Debug от компиляции в режиме Release.

Цитата Сообщение от XiloManX Посмотреть сообщение
Какой смысл таскать всю библиотеку (статическую), в одном исполняемом файле с функциями, которыми никогда не воспользуешься?
никакого. C/C++ ни при чём абсолютно, это заморочки производителей gcc. Я встречался с версиями gcc где такой фигни не было или статическая библиотека была настолько мала, что была именно для проформы. По-моему это есть в Dev-C++ в компиляторе, который идёт по умолчанию, но по умолчанию там версия gcc 3.4.2, так что вот.
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,386
Завершенные тесты: 1
15.02.2013, 04:19 #32
Цитата Сообщение от kravam Посмотреть сообщение
при установке MinGW
Я использую сборки, которые находятся в архивах. Да и установщик вряд ли что то добавляет в системные папки. Дело в переменной среды Path, в которой прописывается путь до папки bin компилятора, где и лежит dll.
0
XiloManX
642 / 146 / 31
Регистрация: 11.02.2013
Сообщений: 277
15.02.2013, 04:46  [ТС] #33
Цитата Сообщение от kravam Посмотреть сообщение
Цитата Сообщение от XiloManX Посмотреть сообщение
А что имеется ввиду, под командной строкой? "Build Log" что ли?
ну когда ты тычешь на F9 для компиляции или куда там, запускается файл gcc или g++ с опциями; это наверное не видно, но это не значит, что она нигде не прописана;
В Dev-C++ по звершении компиляции я тычу "Журнал компиляции" и вижу:
Компилятор: Default compiler
Выполнение g++.exe...
g++.exe "E:\vso_moio\Программирование_на_C++\readme\www_crossplatfor m.ru_node_58\main.cpp" -o "E:\vso_moio\Программирование_на_C++\readme\www_crossplatfor m.ru_node_58\main.exe" -static -I"E:\Dev_Cpp_nomingw\include" -L"E:\Dev_Cpp_nomingw\lib"
Выполнение завершено
Компиляция успешна
Вот нечто подобное должно быть в твоей IDE;
Тут и видны все ключи и все опции с которыми работал компилятор, даже если они не прописаны явно и можно просмотреть чем отличается компиляция в режиме Debug от компиляции в режиме Release.
Ну это "Build Log (табло лога сборки)"?, а не командная строка.

Собственно вот (раздельная установка) (без устаноленных флагов вручную):
-------------- Build: Debug in Example (compiler: GNU GCC Compiler)---------------

mingw32-g++.exe -Wall -fexceptions -g -c "C:\Documents and Settings\Name\My Documents\CodeBlocks\Example\main.cpp" -o obj\Debug\main.o
mingw32-g++.exe -o bin\Debug\Example.exe obj\Debug\main.o
Output size is 57.76 KB
Process terminated with status 0 (0 minutes, 1 seconds)
0 errors, 0 warnings (0 minutes, 1 seconds)
-------------- Build: Release in Example (compiler: GNU GCC Compiler)---------------

mingw32-g++.exe -Wall -fexceptions -O2 -c "C:\Documents and Settings\Name\My Documents\CodeBlocks\Example\main.cpp" -o obj\Release\main.o
mingw32-g++.exe -o bin\Release\Example.exe obj\Release\main.o -s
Output size is 8.50 KB
Process terminated with status 0 (0 minutes, 1 seconds)
0 errors, 0 warnings (0 minutes, 1 seconds)
1
kravam
быдлокодер
1696 / 883 / 45
Регистрация: 04.06.2008
Сообщений: 5,473
15.02.2013, 04:59 #34
Цитата Сообщение от Toshkarik Посмотреть сообщение
Я использую сборки, которые находятся в архивах.
я тоже

Цитата Сообщение от Toshkarik Посмотреть сообщение
Да и установщик вряд ли что то добавляет в системные папки.
проверим в своё время.

Цитата Сообщение от Toshkarik Посмотреть сообщение
Дело в переменной среды Path, в которой прописывается путь до папки bin компилятора, где и лежит dll.
нет. Path тут никаким боком. Представляете работу системного загрузчика? Он просто пробегается по секции импорта и там какие dll-ки написаны, те он и загружает. А прописаны они без абсолютных путей. Просто имя, и всё. Как думаете, будет он обращаться к папке bin? Не будет. Это чистейшей воды теория. А обращается он туда, где они и должны быть:
C:\WINDOWS\system32
А вот сейчас мы всё это дело всё и проверим.

Так, кропаем hello, word без static, смотрим таблицу импорта каким-нибудь редактором и наблюдаем там библиотеку libgcc_s_dw2-1.dll, эта билиотека в C:\WINDOWS\system32. вот оттуда она и загружается; и именно в наличии этой библиотеки и есть разница- при -static эта библиотека будет отсутствовать в таблице импорта

Но справедливости ради надо заметить, что эта же библиотека также находится в папке bin; так, может загрузчик именно из этой папки (благодаря Path) и берёт эту библиотеку? Что ж, идти так до конца. Удалим эту библиотеку из папки bin и запустим наш "Hello, word!" и увидим что он запустится без сучка и задоринки, хотя для запуска ему необходима libgcc_s_dw2-1.dll, а её в папке bin нет (мы её временно удалили).

++++++++++++++++++++++++++++++++++++++++++++++++++

Как-нибудь я сподоблюсь разузнать dll-ки, которые идут с системой, а которые привносятся всякими левыми программами, да руки не доходят никак.
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,386
Завершенные тесты: 1
15.02.2013, 05:09 #35
Цитата Сообщение от kravam Посмотреть сообщение
я тоже
Тогда причем тут установщик?

kravam, я уже проверил. Как я и говорил, все дело в переменной path.

Цитата Сообщение от kravam Посмотреть сообщение
libgcc_s_dw2-1.dll, эта билиотека в C:\WINDOWS\system32
Нет у меня в system32 ни одной библиотеки gcc, и не было.

Если я скомпилирую с динамической линковкой, при этом перемещу файл libstdc++-6.dll из папки bin компилятора, то программа не запускается, и просит этот самый DLL. Как только я его возвращаю, она нормально запускается.

Что бы проверить я переместил библиотеку из папки bin, запустил программу, и, как уже сказал, она не запустилась, требуя эту dll. После чего я создал директорию C:\test, поместил в нее эту самую dll, и добавил ее в переменную окружения path. И программа заработала.

И, наконец, нашел на просторах интернета:
Windows ищет Dll следующим образом:
1. Сначала проверяются все уже загруженные библиотеки, если среди них находится Dll с тем же именем, программа связывается с ней.
2. Затем Windows пытается найти Dll в папке, где расположен исполняемый файл программы, использующей Dll.
3. Затем, Windows пытается найти Dll в текущем каталоге.
4. Затем, Windows пытается найти Dll в системном каталоге Windows (что-то вроде C:\Windows\System32 для NT-систем)
5. Затем, Windows пытается найти Dll в каталоге Windows (что-то вроде C:\Windows)
6. Наконец, Windows пытается найти Dll в одной из папок, перечисленных в переменной окружения PATH
0
XiloManX
642 / 146 / 31
Регистрация: 11.02.2013
Сообщений: 277
15.02.2013, 05:11  [ТС] #36
Цитата Сообщение от Toshkarik Посмотреть сообщение
XiloManX, Это с динамической компоновкой. В любой другой папке, отличной от той, в которой исполняемый файл находится сейчас, он, возможно, не запустится. Придется таскать DLL от MinGW за ней, или использовать статическую компоновку. Скорей всего в той версии, про которую Вы говорите, статическая компоновка была по умолчанию, либо просто не было динамической библиотеки, поэтому компоновка шла сразу статическая. Если Вы добавите флаг -static, что бы не таскать DLL с программой, то размер опять увеличится до 500 kb.
Для эксперимента, попробуйте переименовать или переместить на время файл libstdc++-6.dll в папке bin компилятора.
И действительно. Происходит динамическая компановка по умолчанию.
0
kravam
быдлокодер
1696 / 883 / 45
Регистрация: 04.06.2008
Сообщений: 5,473
15.02.2013, 05:18 #37
Цитата Сообщение от Toshkarik Посмотреть сообщение
Тогда причем тут установщик?
может он просто в архиве, установщик-то? Или файлы из архива берёт.

Цитата Сообщение от Toshkarik Посмотреть сообщение
Если я скомпилирую с динамической линковкой
исходник можно?

Ну всё ясно. Сперва C:\Windows\System32, потом PATH; но говорить, что установщик не пихает *.dll в C:\Windows\System32 неверно- другое дело, что вы им не пользуетесь.
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,386
Завершенные тесты: 1
15.02.2013, 05:21 #38
Цитата Сообщение от kravam Посмотреть сообщение
исходник можно?
Код из первого сообщения темы.
Цитата Сообщение от kravam Посмотреть сообщение
что установщик не пихает *.dll в C:\Windows\System32 неверно- другое дело, что вы им не пользуетесь.
Я и не говорил, что он не копирует туда dll. Я всего лишь сказал, что вряд ли он это делает. И можно уточнить на всякий случай - о каком установщике идет речь?
0
XiloManX
642 / 146 / 31
Регистрация: 11.02.2013
Сообщений: 277
15.02.2013, 05:37  [ТС] #39
Сборка простой программы в Code::Blocks, со статической компановкой (раздельная установка) (с флагом -static или -static-libstdc++)):
C++
1
2
3
4
5
6
7
8
#include <iostream>
 using namespace std;
 
 int main()
 {
    cout << "Hello world!" << endl;
    return 0;
 }
Логи сборки:
-------------- Build: Debug in Example (compiler: GNU GCC Compiler)---------------

mingw32-g++.exe -Wall -fexceptions -g -c "C:\Documents and Settings\Name\My Documents\CodeBlocks\Example\main.cpp" -o obj\Debug\main.o
mingw32-g++.exe -o bin\Debug\Example.exe obj\Debug\main.o -static
Output size is 1.38 MB
Process terminated with status 0 (0 minutes, 3 seconds)
0 errors, 0 warnings (0 minutes, 3 seconds)
-------------- Build: Release in Example (compiler: GNU GCC Compiler)---------------

mingw32-g++.exe -Wall -fexceptions -O2 -c "C:\Documents and Settings\Name\My Documents\CodeBlocks\Example\main.cpp" -o obj\Release\main.o
mingw32-g++.exe -o bin\Release\Example.exe obj\Release\main.o -static -s
Output size is 635.00 KB
Process terminated with status 0 (0 minutes, 2 seconds)
0 errors, 0 warnings (0 minutes, 2 seconds)
Добавлено через 15 минут
Цитата Сообщение от Toshkarik Посмотреть сообщение
Учитывайте еще, что cout это объект класса, который может состоять из объектов других классов. Компилятор не может просто так взять, и выкинуть функцию-член класса. Сравните, например, размер исполняемого файла такого кода:

C++
1
2
3
4
5
#include <cstdio>
int main() {
 printf( "Hello World!!!" );
 return 0;
}
Логи сборки:

В статической компоновке, файл занимает, по крайней мере у меня, 36kb, против 678kb с использованием объекта std::cout.
А у меня, вот что...

Сборка выше указанной простой программы в Code::Blocks, со статической компановкой (раздельная установка) (с флагом -static или -static-libstdc++)):

-------------- Build: Debug in Example (compiler: GNU GCC Compiler)---------------

mingw32-g++.exe -Wall -fexceptions -g -c "C:\Documents and Settings\Name\My Documents\CodeBlocks\Example\main.cpp" -o obj\Debug\main.o
mingw32-g++.exe -o bin\Debug\Example.exe obj\Debug\main.o -static
Output size is 49.66 KB
Process terminated with status 0 (0 minutes, 0 seconds)
0 errors, 0 warnings (0 minutes, 0 seconds)
-------------- Build: Release in Example (compiler: GNU GCC Compiler)---------------

mingw32-g++.exe -Wall -fexceptions -O2 -c "C:\Documents and Settings\Name\My Documents\CodeBlocks\Example\main.cpp" -o obj\Release\main.o
mingw32-g++.exe -o bin\Release\Example.exe obj\Release\main.o -static -s
Output size is 7.50 KB
Process terminated with status 0 (0 minutes, 0 seconds)
0 errors, 0 warnings (0 minutes, 0 seconds)
0
kravam
быдлокодер
1696 / 883 / 45
Регистрация: 04.06.2008
Сообщений: 5,473
15.02.2013, 05:37 #40
Цитата Сообщение от Toshkarik Посмотреть сообщение
Я и не говорил, что он не копирует туда dll. Я всего лишь сказал, что вряд ли он это делает. И можно уточнить на всякий случай - о каком установщике идет речь?
Да, пожалуй вы правы. Установщик в системные директории ничё не распихивает по крайней мере libstdc++-6.dll там не оказалось. libgcc_s_dw2-1.dll оказалась там скорее всего из-за GIMP-а потому, что он тоже использует такую библиотеку. Ну не сам же я её пихал в GIMP да ещё и в system32

если чё mingw-get-inst-20120426.exe

Но вернёмся к нашим баранам.
Цитата Сообщение от kravam Посмотреть сообщение
В любой другой папке, отличной от той, в которой исполняемый файл находится сейчас, он, возможно, не запустится.
запустится, проверено. Да и почему бы ему не запуститься-то? dll в bin- ну пусть так и будет. Теоретических предпосылок тык скыть к незапуску не вижу.
0
XiloManX
642 / 146 / 31
Регистрация: 11.02.2013
Сообщений: 277
15.02.2013, 05:44  [ТС] #41
Видимо, надо изучать С, а не С++. Терпеть не могу, искусственного раздутия программ.
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,386
Завершенные тесты: 1
15.02.2013, 05:48 #42
kravam, например, не запустится, если не будет папки bin в переменной path. Так как, как я уже говорил, я не пользуюсь
Цитата Сообщение от kravam Посмотреть сообщение
mingw-get-inst-20120426.exe
, а использую сборки niXman`a, в которых компилятор идет в одном архиве. И в переменную path добавляю сам путь до папки bin, для возможности компиляции из командной строки и для IDE Netbeans. Просто, на сколько я помню, есть такие среды, которым нужно явно указывать в настройках, где находится компилятор, или нужно указать саму папку с компилятором в переменной path, и им не важна папка bin, пути до нее в переменной path может просто не быть. Вроде Eclipse такая.
0
kravam
быдлокодер
1696 / 883 / 45
Регистрация: 04.06.2008
Сообщений: 5,473
15.02.2013, 05:58 #43
Я над другим задумался. Получается с динамическим подсоединением фигня полная. Так, если я сделал динамическую компоновку, например 20-ти программ и использую их для себя а потом решил снести MinGW, они и не запустятся теперь что ли? Получается, мне щас все эти программы над искать и перекомпоновывать. Грязь какая-то...

А использовать -static... А тогда возникает вопрос- а зачем ВООБЩЕ нужна динамическая компоновка? Чисто для проформы- вот смотрите типа, она есть. Только она бесполезна.

А и выход-то из положения- всего-навсего заставить установщик распихивать библиотеки по системным директориям.
0
XiloManX
642 / 146 / 31
Регистрация: 11.02.2013
Сообщений: 277
15.02.2013, 06:34  [ТС] #44
Цитата Сообщение от kravam Посмотреть сообщение
Я над другим задумался. Получается с динамическим подсоединением фигня полная. Так, если я сделал динамическую компоновку, например 20-ти программ и использую их для себя а потом решил снести MinGW, они и не запустятся теперь что ли? Получается, мне щас все эти программы над искать и перекомпоновывать. Грязь какая-то...
А использовать -static... А тогда возникает вопрос- а зачем ВООБЩЕ нужна динамическая компоновка? Чисто для проформы- вот смотрите типа, она есть. Только она бесполезна.
А и выход-то из положения- всего-навсего заставить установщик распихивать библиотеки по системным директориям.
На сколько я знаю, динамические библиотеки, сделаны для уменьшения размера программ, и экономии пространства на диске. То есть динамические библиотеки, выступают в роли помойки, в которой много всего, можно всем пользоваться, но ничего нельзя брать с собой. А программы - это нищеброды: приходят, попользуются и уходят.

А вообще, я тоже не очень люблю динамические библиотеки. По нескольким причинам:
1. При запуске программы, создаются сильные тормоза и съедается много памяти.
2. Куча библиотек, с ненужным набором функций, которыми я никогда не воспользуюсь. Все эти библиотеки будут висеть мёртвым грузом. И что олучается? Библиотеки сделаны для экономии пространства, но на самом деле, они ничего не экономят.
3. Чтобы запустить одну программу размером 10Мб, надо таскать с собой тонну библиотек размером, как минимум в несколько сотен мегобайт, а то и больше.
4. Плюс DLL Hell.
Цитата Сообщение от kravam Посмотреть сообщение
Получается с динамическим подсоединением фигня полная. Так, если я сделал динамическую компоновку, например 20-ти программ и использую их для себя а потом решил снести MinGW, они и не запустятся теперь что ли? Получается, мне щас все эти программы над искать и перекомпоновывать. Грязь какая-то...
Но тут есть только три варианта:либо таскать DLL с собой, либо сделать инстоллятор, который будет автоматически устанавливать программу, либо сделать статическую компановку.
0
kravam
быдлокодер
1696 / 883 / 45
Регистрация: 04.06.2008
Сообщений: 5,473
15.02.2013, 06:45 #45
Цитата Сообщение от XiloManX Посмотреть сообщение
Но тут есть только три варианта:либо таскать DLL с собой, либо сделать инстоллятор, который будет автоматически устанавливать программу, либо сделать статическую компановку.
да, но я-то говорю о случае, когда я как был за компом так за компом и остался.

Куда таскать? Комп один и тот же...
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.02.2013, 06:45
Привет! Вот еще темы с ответами:

Дайте совет по связке wxWidgets+codeblocks - C++ IDE
Хочу попробовать создание программы с оконным интерфейсом. С горем пополам связку wxWidgets+codeblocks завел. Стартовое приложение с формой...

Как поменять кодировку символов в CodeBlocks - C++ IDE
Ребята, пожалуйста, помогите, чтобы работала моя программа, я должен с Unicode кодировки перейти на Шестнадцатиричную, но не знаю как это...

Непонятки в Visual studio express 2012 и CodeBlocks - C++ IDE
Когда шаг доходит до cin, во время отладки, то перекидывает в библиотеку iostream, как я понимаю. Далее, нужно довольно долго жать f11,...

Удаление Codeblocks/ - C++
После удаления Codeblocks значки *.cpp отображаются так. как будто Codeblocks установлен. Как правильно удалить эту программу? Одним...


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

Или воспользуйтесь поиском по форуму:
45
Yandex
Объявления
15.02.2013, 06:45
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru