Проблема с смартлинком
Модератор: Модераторы
Имеется проект win32 OpenGl.
без смартлинка собирается и работает, всё ок.
Cо смартлинком собирается, но при запуске вылетает на первом glGet или glVertex.
Посмотрел секцию импорта в ексешнике, этих функций нет, и вообще из opengl32.dll импортируется всего несколько функций, должно быть гораздо больше.
Не подскажите куда копать?
без смартлинка собирается и работает, всё ок.
Cо смартлинком собирается, но при запуске вылетает на первом glGet или glVertex.
Посмотрел секцию импорта в ексешнике, этих функций нет, и вообще из opengl32.dll импортируется всего несколько функций, должно быть гораздо больше.
Не подскажите куда копать?
-
PVOzerski
- постоялец
- Сообщения: 109
- Зарегистрирован: 19.05.2005 13:45:10
- Откуда: СПб
- Контактная информация:
Если функции импортируются статически, явно задействованы в коде и при этом отсутствуют в экзешнике - похоже на глюк компилятора. Иногда помогали стирание всех промежуточных ассемблерных, объектных, библиотечных, PPU-шных файлов и полная пересборка проекта. Если глюк настоящий, можно попытаться обойти его, запретив смартлинк конкретно для интерфейсного модуля с объявлениями функций OpenGL: {$smartlink off}
Не уверен я, что дело в смартлинке. Сие чудо всеголишь вместо одного объектного файла создает несколько, при этом каждая функция в отдельном файле. Далее линкер присоединяет только те объектный файлы которые востребованы (идея стара как мир, применялась еще во времена ms-dos). Т.е. на вызовы функций из dll это вообще не должно влиять. Может дело в опциях оптимизации?
Возможно при отключении смартлинка отключается что-то еще.
Возможно при отключении смартлинка отключается что-то еще.
-
Guest
-
PVOzerski
- постоялец
- Сообщения: 109
- Зарегистрирован: 19.05.2005 13:45:10
- Откуда: СПб
- Контактная информация:
На самом деле, со смарт-линком дело обстоит чуть хитрее. Действительно, из одного юнита делается набор obj-модулей, но сейчас компилятор в нынешнем его виде (по крайней мере, для win32) прямо, без промежуточных файлов и вызова внешних утилит, генерит статические библиотеки в формате coff (аналогичные тем, что делает утилита ar из объектных файлов). Если в генерации кусков, ответственных за idata-секцию, проявится баг, результат будет, пожалуй, именно как описан в начале ветки.
Кстати, вот идея еще: попробовать пересобрать, используя внешний ассемблер. (ppc386 -s -a, потом запустить созданный батничек). Заодно и asm-код посмотреть будет можно.
Кстати, вот идея еще: попробовать пересобрать, используя внешний ассемблер. (ppc386 -s -a, потом запустить созданный батничек). Заодно и asm-код посмотреть будет можно.
-OG3p3
я бы попробовал это убрать
смартлинк включается в тексте программы {$SMARTLINK+}
{$smartlink off} в мдуле описаний функций opengl не помог, в ексешник функции не проходят
лучше сразу -CX в конфиге, а при необходимости отключать в модуле директивой
Кстати, вот идея еще:
т.е. сделать смартлинк вручную
Мужики, может глянете если не лень? 
<a href='http://zcad.nm.ru/smartlinc.rar' target='_blank'>http://zcad.nm.ru/smartlinc.rar</a>
Оставил только вызов glvertex, понятно что на не инициализированном контексте OpenGL он работать не будет, но хоть в таблицу импорта должен попадать.
Забыл сказать, там модуль opengl.pas разделен на 2, в одном объявлены функции, в другом константы. такчто используется не стандартный модуль
<a href='http://zcad.nm.ru/smartlinc.rar' target='_blank'>http://zcad.nm.ru/smartlinc.rar</a>
Оставил только вызов glvertex, понятно что на не инициализированном контексте OpenGL он работать не будет, но хоть в таблицу импорта должен попадать.
Забыл сказать, там модуль opengl.pas разделен на 2, в одном объявлены функции, в другом константы. такчто используется не стандартный модуль
