Russian Qt Forum
Сентябрь 30, 2024, 22:25 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: проблемы с компиляцией программы  (Прочитано 12756 раз)
alex
Гость
« : Декабрь 28, 2012, 11:46 »

Значит скомпилировал бибилотеку Qt с MSVS. а при попытке скомпилировать в ней проект с помощью MinGW получил ошибку.Почему нельзя использовать разные компиляторы?
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #1 : Декабрь 28, 2012, 12:25 »

Потому что разные компиляторы по разному компилируют ...
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #2 : Декабрь 28, 2012, 14:32 »

Значит скомпилировал бибилотеку Qt с MSVS. а при попытке скомпилировать в ней проект с помощью MinGW получил ошибку.Почему нельзя использовать разные компиляторы?

Потому что нужно писать стандартный код.
Записан
Bepec
Гость
« Ответ #3 : Декабрь 28, 2012, 14:34 »

Компиляторы должны придерживаться стандарта языка.

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

Это конечно удобнее, например массивы динамической длины. Но однако при компиляции такого кода другим компилятором возникнут ошибки, которые иногда просто дьявольски трудно выпиливать.
Записан
Dancing_on_water
Гость
« Ответ #4 : Декабрь 28, 2012, 15:52 »

Значит скомпилировал бибилотеку Qt с MSVS. а при попытке скомпилировать в ней проект с помощью MinGW получил ошибку.Почему нельзя использовать разные компиляторы?

Ты пытаешься с помощью MinGW скомпилировать проект, используя dll скомпилированные в MSVC?
Записан
alex
Гость
« Ответ #5 : Декабрь 29, 2012, 12:52 »

Значит скомпилировал бибилотеку Qt с MSVS. а при попытке скомпилировать в ней проект с помощью MinGW получил ошибку.Почему нельзя использовать разные компиляторы?

а вы правы но я все равно не понимаю. Поясните на примерах ваши слова
Записан
Bepec
Гость
« Ответ #6 : Декабрь 29, 2012, 14:39 »

Код:
int a = *;//ввод пользователем.
int b[a];
MinGW пропустит такой код и скомпилирует.
MS такой код обругает матом и убьёт жалкую попытку скомпилировать.

Ибо по стандарту массивы должны быть константной длины, или же создаваться оператором new. (могу и ошибаться Улыбающийся )
Записан
Dancing_on_water
Гость
« Ответ #7 : Декабрь 29, 2012, 16:42 »

Судя по цитате это обращение ко мне. Но я ничего не понял Улыбающийся

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

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

Думаю (но не уверен, т.к. не копал тему глубоко), что именно в этом причина.
P.S. сплошь рядом присутствуют проблемы при загрузке dll с классами собранные не просто разными компиляторами, но и разными версиями одного и тогоже компилятора.
Записан
mutineer
Гость
« Ответ #8 : Декабрь 29, 2012, 16:46 »

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

Могут спокойно, если у них совпадает формат вызова (порядок заталкивания параметров в стек, etc) либо он указан явно и одинаков
Записан
Bepec
Гость
« Ответ #9 : Декабрь 29, 2012, 17:19 »

Проще выражаясь - хрен что ТС скомпилит, если библиотеки скомпилены другим компилятором.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Декабрь 29, 2012, 18:31 »

Код:
int a = *;//ввод пользователем.
int b[a];
MinGW пропустит такой код и скомпилирует.
MS такой код обругает матом и убьёт жалкую попытку скомпилировать.

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

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

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

 
Записан
alex
Гость
« Ответ #11 : Декабрь 29, 2012, 18:35 »

спасибо вам магистры за информацию
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #12 : Декабрь 29, 2012, 18:42 »

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

Сообщений: 11445


Просмотр профиля
« Ответ #13 : Декабрь 29, 2012, 19:04 »

Не реализация, а именование (mangling) функций и методов различаются у разных компиляторов.
Поля данных разные. А у MSVC они могут быть разными даже для debug/release и зависеть от директив компилятора
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #14 : Декабрь 29, 2012, 19:10 »

Поля данных разные. А у MSVC они могут быть разными даже для debug/release и зависеть от директив компилятора
Не знаю, что имеется ввиду под "поля данных"... Есть соглашения о вызовах, если их соблюдать то все будет работать, методы будут спокойно получать входные параметры.
Если имеется ввиду внутренняя структура объектов классов, то здесь тоже все будет нормально. Главное не создавать объект конструктором из одной библиотек, а для работы использовать методы из другой. Ну до такого вряд-ли кто-то додумается.
« Последнее редактирование: Декабрь 29, 2012, 19:28 от Old » Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.085 секунд. Запросов: 23.