На главную... Продукты | Технологии | Классификаторы | Проекты | Скачать | Цены| Форум | Статьи | Обучение | Контакты

Компиляция под Builder XE5 и XE10

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: 1
RSS
Компиляция под Builder XE5 и XE10, Ошибка в скомпилированной программе
 
При запуске программы, скомпилированной под win32 на Builder XE10 (Tokio) Win10 64 возникает ошибка.
При запуске программы, скомпилированной под win32 на Builder XE5 Win7 64 ошибка не возникает.
В чем может быть причина.
GisToolKit 13
Изменено: Vladimir Sturza - 02.11.2020 09:48:32
 
Скрин ошибки
error.jpg (8.23 КБ)
 
Цитата
Vladimir Sturza написал:
В чем может быть причина.

1. Ошибка работы с памятью непосредственно в коде Вашей программы. То, что она проявляется только после сборки в одном из компиляторов, говорит только лишь о том, что память в собранном двоичном коде распределяется по-другому.   Ошибка может появится в другом месте, а может и не проявить себя до поры. Надо смотреть в отладчике.

2. Проверьте опции проектов. Если у Вас это два разных проекта, то придется их сравнить. Если в XE10 и XE5 компилируется один и тот же проект, стоит проверить, какие именно модули в него подключаются. Лишние убрать, обратить внимание на модули, подключаемые по прямым путям - в этом случае могут подтягиваться модули "чуждые" данному компилятору.

3. Как у Вас установлен GIS ToolKit  в XE10 и XE5? При установке одновременно в две разные среды разработки крайне нежелательно, чтобы обе среды работали с одной и той же директорией GTK. В этом случае обоими компиляторами будут использованы *.dcu, *.hpp - модули GIS ToolKit, скомпилированные при первой установке в одну из сред разработки, что неправильно! Проверьте также пути в переменной окружения gtk13 в обеих средах разработки. Пути должны быть разными - для каждой среды разработки - к своему экземпляру GTK.
 
Программы-библиотеки одниаковые. Разница только в компонентах ГИС оди XE5, другой XE10. Среды программиования на разных комьпьтерах. Если вызывающая библиотеку программа скомпилирована в той же среде разработки, то ошибки нет. Если поменять  - вызывать библиотеку скомпилируванную по другой средой то в обоих случаях ошибка. Получается EXE XE5, DLL XE5 и EXE XE10 DLL XE10 работают без ошибок, а EXE XE5 DLL XE10 и EXE XE10 DLL XE5 вызывают ошибку. Поэтому не понятно где искать.
 
Цитата
Vladimir Sturza написал:
Если вызывающая библиотеку программа скомпилирована в той же среде разработки, то ошибки нет.

Скорее всего, это и есть ключ к решению проблемы.

Библиотека и вызывающий *.exe используют VCL и/или RTL библиотеки?

Если Вы хотите, чтобы DLL и EXE были независимы друг от друга, их надо собирать без runtime packages. Тогда у каждого будет свой экземпляр VCL и RTL.
В противном случае библиотека будет пытаться использовать экземпляр VCL уже загруженный в память процесса вызывающего модуля, а он от другой версии Embarcadero.

Отключение runtime packages, кстати, не очень хорошо, поскольку Embarcadero до сих пор не устранили утечку памяти при множественной загрузке VCL. Но это способ сделать библиотеку "независимой" от вызывающего процесса.

В опциях проекта уберите галку "Link with runtime packages", в "Runtime package import library" пропишите "vcl, rtl", в свойствах линковщика снимите галку "Link with Dynamic RTL".

Вот, кстати, рекомендации из readme.txt (см. п.1 и п.2)
Цитата

--------------------------------------------------------------------------------
 Создание приложений в С++ Builder
--------------------------------------------------------------------------------
При настройке проекта обращайте внимание на текущую платформу и вариант сборки.
По возможности надо делать настройки для Варианта All Configurations-All Platforms.

1. В опциях проекта для раздела С++ Linker параметр Link with Dynamic RTL должен
   иметь значение false.

2. В опциях проекта для раздела Packages\Runtime Packages параметр Link with
   runtime  packages должен иметь значение false, либо для раздела Packages для
   параметра Design packages надо отменить разрешение для пакета GIS ToolKit
   Professional.

3. В проект надо добавить библиотеки:
   - для x32 - gis32acces.lib;
   - для x64 - gis64acces.a.

4. Если в проекте используется статическая линкова библиотек ГИС-ядра (кроме
   gisuacces.lib или gisu64acces.a) для прямого вызова функций MAPAPI, то для
   таких библиотек надо в проект подключить аналогичный файл *.lib (*.a).
   Библиотеки находятся в директории  Создать Gistool13\Dll\X32\lib
   (Gistool13\Dll\X64\lib). Пересоздать эти файлы можно выполнив команду
   Gistool13\Dll\X32\build_lib.bat (Gistool13\Dll\X64\build_a.bat).
 
Используется VCL. Все, что вы описали так и настроено. DLL создана в XE10, при переносе на XE5 меняется только MapPackCBXE10.bpl на MapPackCBXE5.bpl. Используется динамическая линковка. Проверялись оба варианта пп.2. Результат одинаковый. Библиотеки скомпилированные в разных средах одновременно не работают.  
 
1. Какая версия GIS ToolKit используется?

2. Что экспортируется из Вашей библиотеки и по каким стандартам вызова? Есть ли экспорт объектов напрямую или как параметров API-функций? Соблюдается ли в этом случае требование Embarcadero по использованию менеджера памяти?

Цитата

Important note about DLL memory management when your DLL uses the
static version of the RunTime Library:

If your DLL exports any functions that pass String objects (or structs/
classes containing nested Strings) as parameter or function results,
you will need to add the library MEMMGR.LIB to both the DLL project and
any other projects that use the DLL.  You will also need to use MEMMGR.LIB
if any other projects which use the DLL will be performing new or delete
operations on any non-TObject-derived classes which are exported from the
DLL. Adding MEMMGR.LIB to your project will change the DLL and its calling
EXE's to use the BORLNDMM.DLL as their memory manager.  In these cases,
the file BORLNDMM.DLL should be deployed along with your DLL.

To avoid using BORLNDMM.DLL, pass string information using "char *" or
ShortString parameters.

If your DLL uses the dynamic version of the RTL, you do not need to
explicitly add MEMMGR.LIB as this will be done implicitly for you.


Цитата
Vladimir Sturza написал:
Библиотеки скомпилированные в разных средах одновременно не работают.

Одновременно библиотеки, экспортирующие одинаковые функции и одноименные объекты, в один процесс загрузить нельзя.
 
Сделал тестовый пример.
Собрал и в XE5,  и в XE10.3.

Комбинации EXE(XE10.3)->DLL(XE5) и EXE(XE5)->DLL(XE10.3) работают без ошибок и в Win7 x64, и в Win10 x64.

Пример тут.
 
Спасибо за пример и за помощь. Как отыщу проблему, отпишусь.
 
В любом случае (из опыта работы с Embacadero) нельзя смешивать exe, dll, которые собраны в разных версиях Embacadero. Сегодня будет работать, а при использовании другого компонента (класса) Embacadero перестанет.  
Страницы: 1
Читают тему (гостей: 1)



© КБ Панорама, 1991-2024

Регистрируясь или авторизуясь на форуме, Вы соглашаетесь с Политикой конфиденциальности