Russian Qt Forum

Qt => Установка, сборка, отладка, тестирование => Тема начата: alex от Декабрь 28, 2012, 11:46



Название: проблемы с компиляцией программы
Отправлено: alex от Декабрь 28, 2012, 11:46
Значит скомпилировал бибилотеку Qt с MSVS. а при попытке скомпилировать в ней проект с помощью MinGW получил ошибку.Почему нельзя использовать разные компиляторы?


Название: Re: проблемы с компиляцией программы
Отправлено: Fregloin от Декабрь 28, 2012, 12:25
Потому что разные компиляторы по разному компилируют ...


Название: Re: проблемы с компиляцией программы
Отправлено: Alex Custov от Декабрь 28, 2012, 14:32
Значит скомпилировал бибилотеку Qt с MSVS. а при попытке скомпилировать в ней проект с помощью MinGW получил ошибку.Почему нельзя использовать разные компиляторы?

Потому что нужно писать стандартный код.


Название: Re: проблемы с компиляцией программы
Отправлено: Bepec от Декабрь 28, 2012, 14:34
Компиляторы должны придерживаться стандарта языка.

Компиляторы аля MinGW позволяют отступать от стандарта.

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


Название: Re: проблемы с компиляцией программы
Отправлено: Dancing_on_water от Декабрь 28, 2012, 15:52
Значит скомпилировал бибилотеку Qt с MSVS. а при попытке скомпилировать в ней проект с помощью MinGW получил ошибку.Почему нельзя использовать разные компиляторы?

Ты пытаешься с помощью MinGW скомпилировать проект, используя dll скомпилированные в MSVC?


Название: Re: проблемы с компиляцией программы
Отправлено: alex от Декабрь 29, 2012, 12:52
Значит скомпилировал бибилотеку Qt с MSVS. а при попытке скомпилировать в ней проект с помощью MinGW получил ошибку.Почему нельзя использовать разные компиляторы?

а вы правы но я все равно не понимаю. Поясните на примерах ваши слова


Название: Re: проблемы с компиляцией программы
Отправлено: Bepec от Декабрь 29, 2012, 14:39
Код:
int a = *;//ввод пользователем.
int b[a];
MinGW пропустит такой код и скомпилирует.
MS такой код обругает матом и убьёт жалкую попытку скомпилировать.

Ибо по стандарту массивы должны быть константной длины, или же создаваться оператором new. (могу и ошибаться :) )


Название: Re: проблемы с компиляцией программы
Отправлено: Dancing_on_water от Декабрь 29, 2012, 16:42
Судя по цитате это обращение ко мне. Но я ничего не понял :)

Верес: по стандарту много что должно быть и чего компиляторы делают\не делают. Но Qt написан так, что в хедерах  API нет (по крайне мере я не встречал) зависимости от компиляторов. т.е. все платформо\компиляторо- зависимый код уде откомпилирован и спрятан в dll. Здесь дело здесь в другом.

Формат dll описан для вызова функций, наподобие паскалевских или сишных,  и все компиляторы спокойно могу юзать dll, скомпилированные в другом компиляторе, если там только функции. А вот насчет классов, то формат это не регламентирует. И каждый компилятор решает задачу загрузки\линковки по-своему.

Думаю (но не уверен, т.к. не копал тему глубоко), что именно в этом причина.
P.S. сплошь рядом присутствуют проблемы при загрузке dll с классами собранные не просто разными компиляторами, но и разными версиями одного и тогоже компилятора.


Название: Re: проблемы с компиляцией программы
Отправлено: mutineer от Декабрь 29, 2012, 16:46
Формат dll описан для вызова функций, наподобие паскалевских или сишных,  и все компиляторы спокойно могу юзать dll, скомпилированные в другом компиляторе, если там только функции.

Могут спокойно, если у них совпадает формат вызова (порядок заталкивания параметров в стек, etc) либо он указан явно и одинаков


Название: Re: проблемы с компиляцией программы
Отправлено: Bepec от Декабрь 29, 2012, 17:19
Проще выражаясь - хрен что ТС скомпилит, если библиотеки скомпилены другим компилятором.


Название: Re: проблемы с компиляцией программы
Отправлено: Igors от Декабрь 29, 2012, 18:31
Код:
int a = *;//ввод пользователем.
int b[a];
MinGW пропустит такой код и скомпилирует.
MS такой код обругает матом и убьёт жалкую попытку скомпилировать.

Ибо по стандарту массивы должны быть константной длины, или же создаваться оператором new. (могу и ошибаться :) )
Насколько мне известно, в стандарт эта удобная вещичка не входит, но практически все компиляторы ее поддерживают, может MSVC единственный что нет. Однако какое это отношение имеет к скомпилированной статик либе? Код создан и в либе сидит, линкеру может помешать только отсутствие внешних ссылок. "Удобный массив" создается через alloca (именно "a" в конце). Если MSVC видит alloca в какой-то из своих либ - то все слинкуется и будет работать. Если же подключается dll - то все еще проще, совпадали бы правила вызова как уже сказали выше.

Однако если в дело вмешивается напр STL, то все, приплыли. Потому что реализация того же std::vector различна в разных компиляторах, эта внешняя ссылка остается неразрешенной, должен быть только свой/родной vector.

Практически вывод тот же: компилируйте все однообразно и не ищите приключений  :)

 


Название: Re: проблемы с компиляцией программы
Отправлено: alex от Декабрь 29, 2012, 18:35
спасибо вам магистры за информацию


Название: Re: проблемы с компиляцией программы
Отправлено: Old от Декабрь 29, 2012, 18:42
Однако если в дело вмешивается напр STL, то все, приплыли. Потому что реализация того же std::vector различна в разных компиляторах, эта внешняя ссылка остается неразрешенной, должен быть только свой/родной vector.
Не реализация, а именование (mangling) функций и методов различаются у разных компиляторов.


Название: Re: проблемы с компиляцией программы
Отправлено: Igors от Декабрь 29, 2012, 19:04
Не реализация, а именование (mangling) функций и методов различаются у разных компиляторов.
Поля данных разные. А у MSVC они могут быть разными даже для debug/release и зависеть от директив компилятора


Название: Re: проблемы с компиляцией программы
Отправлено: Old от Декабрь 29, 2012, 19:10
Поля данных разные. А у MSVC они могут быть разными даже для debug/release и зависеть от директив компилятора
Не знаю, что имеется ввиду под "поля данных"... Есть соглашения о вызовах, если их соблюдать то все будет работать, методы будут спокойно получать входные параметры.
Если имеется ввиду внутренняя структура объектов классов, то здесь тоже все будет нормально. Главное не создавать объект конструктором из одной библиотек, а для работы использовать методы из другой. Ну до такого вряд-ли кто-то додумается.


Название: Re: проблемы с компиляцией программы
Отправлено: Dancing_on_water от Декабрь 29, 2012, 19:47
Ага, но сколь я понял по вот этой (http://www.ownedcore.com/forums/world-of-warcraft/world-of-warcraft-bots-programs/wow-memory-editing/281008-gcc-thiscall-calling-convention-linux-win32-mingw.html) ссылке соглашение о вызове разные компиляторы понимают по разному. Я прав?


Название: Re: проблемы с компиляцией программы
Отправлено: Old от Декабрь 29, 2012, 20:06
Ага, но сколь я понял по вот этой (http://www.ownedcore.com/forums/world-of-warcraft/world-of-warcraft-bots-programs/wow-memory-editing/281008-gcc-thiscall-calling-convention-linux-win32-mingw.html) ссылке соглашение о вызове разные компиляторы понимают по разному. Я прав?
Эта ссылка про одно из соглашений - thiscall. Я не проверял, но пока нет повода для сомнений. :)


Название: Re: проблемы с компиляцией программы
Отправлено: Dancing_on_water от Декабрь 29, 2012, 20:34
Ну с stdcall у меня тоже все работает. (Но ведь в класс это не запихнешь?)


Название: Re: проблемы с компиляцией программы
Отправлено: Old от Декабрь 29, 2012, 20:56
Ну с stdcall у меня тоже все работает. (Но ведь в класс это не запихнешь?)
Да.
Если будет патовая ситуация (есть библиотека собранная msvc и ее нужно использовать в проекте с gcc), то можно попробовать выкрутиться (и то будут проблемы с теми же исключениями). А в обычной жизни проще все собирать одним компилятором.


Название: Re: проблемы с компиляцией программы
Отправлено: Igors от Декабрь 30, 2012, 11:06
Если имеется ввиду внутренняя структура объектов классов, то здесь тоже все будет нормально. Главное не создавать объект конструктором из одной библиотек, а для работы использовать методы из другой. Ну до такого вряд-ли кто-то додумается.
По-моему наоборот, трудно "не додуматься". Пример
Код
C++ (Qt)
void Scan( const std::vector<int> & vec )   // эта ф-ция статик либы откомпилированной MSVC debug
..
Scan(vec);  // а вызывающее приложение откомпилировано MSVC release
 
Результат: краш в потрохах <vector>. Почему дают слинковать - хз, логика MS недоступна моему пониманию :'(  


Название: Re: проблемы с компиляцией программы
Отправлено: Old от Декабрь 30, 2012, 11:14
Почему дают слинковать - хз, логика MS недоступна моему пониманию :'(  
Ну это проблемы конкретно MSVC, для них это нормально. :)


Название: Re: проблемы с компиляцией программы
Отправлено: Igors от Декабрь 30, 2012, 11:59
Ну это проблемы конкретно MSVC, для них это нормально. :)
То да, но мы не можем надеяться что некий "компилятор X" создаст vector который устроит MSVC - ведь оно само его создает с трудом :) Напр если мы компилили либу Scan чем-то другим - результат crash (даже если как-то уговорить линкер)