Автор Тема: MinGW  (Прочитано 32161 раз)

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: MinGW
« Ответ #60 : Март 23, 2013, 02:13:24 pm »
Эм, а директивы экспорта конкретных процедур в коде используются (__declspec(dllexport))? Или нужно абсолютно всё экспортировать?
Да. Нужно все.
Для того, чтобы выходные имена получались без искажения (name mangling), то использование DEF-файла — единственный способ.
Пичаль. Ну я тут уже нашел утилиту: http://purefractalsolutions.com/show.php?a=utils/expdef
Помогло.

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: MinGW
« Ответ #61 : Март 23, 2013, 02:16:16 pm »
Эм, а директивы экспорта конкретных процедур в коде используются (__declspec(dllexport))?
Нет

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: MinGW
« Ответ #62 : Март 23, 2013, 02:23:06 pm »
Товарищи, еще вопрос:
Ключ /MD при компиляции стоит использовать?

Или как сделать чтобы зависимость была от MSVCRT.dll, а не от MSVCR110.dll.

Или это все фобии? O_o

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: MinGW
« Ответ #63 : Март 23, 2013, 02:30:01 pm »
Для того, чтобы выходные имена получались без искажения (name mangling), то использование DEF-файла — единственный способ.
В Си нет манглинга имен, соответственно и проблем нет. А что такое def-файл я не знаю :-)
Y = λf.(λx.f (x x)) (λx.f (x x))

Berserker

  • Sr. Member
  • ****
  • Сообщений: 254
    • Просмотр профиля
Re: MinGW
« Ответ #64 : Март 23, 2013, 03:45:57 pm »
mangle — портить, искажать  ;)

DEF-файл содержит перечень экспортируемых идентификаторов в виде: "внешнее имя = внутреннее имя".

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: MinGW
« Ответ #65 : Март 23, 2013, 03:55:39 pm »
В Си нет манглинга имен, соответственно и проблем нет. А что такое def-файл я не знаю :-)

Оно все равно туда подчеркивание добавляет... Я помню именно поэтому заморачивался с .def файлами. Но это актуально только если потому грузить надо ручками и динамически по имени (и не хочется иметь подчеркивание).

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: MinGW
« Ответ #66 : Март 23, 2013, 04:39:19 pm »
mangle — портить, искажать  ;)

DEF-файл содержит перечень экспортируемых идентификаторов в виде: "внешнее имя = внутреннее имя".

Гм. Я правильно понимаю, что это какая-то особенность мелкомягкого компилятора? Потому как в других компиляторах я ничего подобного вроде бы не встречал.
Y = λf.(λx.f (x x)) (λx.f (x x))

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: MinGW
« Ответ #67 : Март 23, 2013, 04:44:28 pm »
mangle — портить, искажать  ;)

DEF-файл содержит перечень экспортируемых идентификаторов в виде: "внешнее имя = внутреннее имя".
Я знаю как переводится слово mangle. Так вот, в Си функции экспортируются с именами as is. И это понятно почему.

А С++ язык более богатый, там для того чтобы вызвать функцию неплохо бы знать еще и типы аргументов (функция foo(int) и foo(double) - это две РАЗНЫЕ функции в С++, а в Си foo можно вызвать с любым аргументом и функция может быть только одна с именем foo), поэтому в имя функции вводят еще и типы аргументов (просто потому, что эту инфу больше положить там не куда).

Ровно та же песня, скажем в Аде.
Y = λf.(λx.f (x x)) (λx.f (x x))

Jordan

  • Sr. Member
  • ****
  • Сообщений: 282
    • Просмотр профиля
Re: MinGW
« Ответ #68 : Май 12, 2013, 06:00:06 pm »
Как уменьшить размер exe?

Компилю так "e:\MinGW\bin\g++" -Wall -static -s -O2 main.cpp
весит 600 кб. Если убрать -static требует какие то левые dll.

Что компилю

#include <iostream>
#include <string>

using namespace std;

int main(int argc, char* argv[])
{
  string s = "Hello World!";
  cout<< s <<endl;
}

Jordan

  • Sr. Member
  • ****
  • Сообщений: 282
    • Просмотр профиля
Re: MinGW
« Ответ #69 : Май 12, 2013, 06:05:27 pm »
И ещё вопрос. Как избавиться при компиляции от dll в папке проекта. Без dll, g++ ругается, что их нет, хотя в папке mingw они есть.

Вот как это выглядит сейчас.


Valery Solovey

  • Hero Member
  • *****
  • Сообщений: 509
    • Просмотр профиля
Re: MinGW
« Ответ #70 : Май 12, 2013, 06:13:34 pm »
Как уменьшить размер exe?
Для начала можете попробовать натравить strip на объектные файлы, которые получились у Вас в результате трансляции. Если в MinGW есть маны, то обращайтесь за справкой в man strip. Затем, результирующие объектники можете скомпоновать в исполнимый файл.
P.S. Я давно уже с сями баловался, поэтому мог немного ошибиться.
« Последнее редактирование: Май 12, 2013, 06:15:49 pm от Valery Solovey »

DddIzer

  • Гость
Re: MinGW
« Ответ #71 : Май 12, 2013, 06:22:58 pm »
И ещё вопрос. Как избавиться при компиляции от dll в папке проекта. Без dll, g++ ругается, что их нет, хотя в папке mingw они есть.

Вот как это выглядит сейчас.


ощущение, что у вас коряво встал mingw...

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: MinGW
« Ответ #72 : Май 12, 2013, 06:41:40 pm »
Как уменьшить размер exe?

Компилю так "e:\MinGW\bin\g++" -Wall -static -s -O2 main.cpp
весит 600 кб. Если убрать -static требует какие то левые dll.

Всякую отладочную информацию из exe-файла можно убрать программой strip из комплекта утилит gcc, если размер всё ещё велик -- то затем обработать программой NSPACK, например...
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

Jordan

  • Sr. Member
  • ****
  • Сообщений: 282
    • Просмотр профиля
Re: MinGW
« Ответ #73 : Май 12, 2013, 07:34:29 pm »
опция -s использует strip. Ладно размер экзешника не критичен.

Подключил библиотеку sdl, всё нормально, но выдает ошибку

Цитировать

g:\3>"e:\MinGW\bin\g++" -static -s -O2 -lmingw32 -lSDLmain -lSDL.dll main.cpp
E:\DOCUME~1\┼┬├┼═╚╔\LOCALS~1\Temp\ccf5a61A.o:main.cpp:(.text+0x43): undefined re
ference to `SDL_SetVideoMode'
collect2: ld returned 1 exit status

g:\3>call a.exe
"a.exe" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

g:\3>pause
Для продолжения нажмите любую клавишу . . .

Не может найти функцию SDL_SetVideoMode, но SDL_Init видит.

Гуглил вопрос пишут, что нужно подключить -lSDL, но библиотека подключена.
В чём может быть проблема?

Jordan

  • Sr. Member
  • ****
  • Сообщений: 282
    • Просмотр профиля
Re: MinGW
« Ответ #74 : Май 12, 2013, 07:35:24 pm »
Может и правда mingw криво встал.