Starkits использует некоторые хитрые трюки, чтобы иметь возможность загружать библиотеки, которые хранятся в виртуальной файловой системе, связанной с самим starkit. В Unix вы можете указать загрузчику библиотеки ОС загружать библиотеку из произвольного блока данных, но в Windows вы можете загружать библиотеки только из реальных файлов на диске.
Чтобы учесть это ограничение, Windows-старкиты сначала копируют библиотеку из виртуальной файловой системы в реальную файловую систему в виде временного файла. Отсюда и имена временных файлов.
Теперь все это прекрасно работает, если библиотеки в вашем старките не имеют зависимостей от других библиотек в вашем старките. В вашем случае ваш libmysqltcl.dll, вероятно, зависит от libmySQL.dll. Во время загрузки оба из них были скопированы в реальную файловую систему, но с именами временных файлов, поэтому загрузчик не может найти libmySQL.dll.
У вас есть пара вариантов для решения этой проблемы:
Устраните эти зависимости второго уровня из ваших библиотек. В этом случае это означает пересоздание libmysqltcl.dll со статической связью с содержимым в libmySQL.dll, а не динамическое связывание его с DLL.
Прежде чем пакет потребует в вашем сценарии запуска, явно скопируйте зависимости второго уровня из вашего starkit в местоположение в реальной файловой системе, затем обновите переменную среды PATH, чтобы включить этот каталог .
Вариант № 2 будет выглядеть примерно так:
set dirname [file dirname [info script]]
set tmpdir [file join $env(TEMP) __myapp__]
file mkdir $tmpdir
foreach dll {libmySQL.dll} {
if { ![file exists [file join $tmpdir $dll]] } {
file copy -force [file join $dirname bin $dll] $tmpdir
}
}
set ::env(PATH) "$tmpdir;$env(PATH)"
Тогда вы сможете выполнить пакет, требующий , как и ожидалось.
Конечно, это немного неуклюже, но вина лежит прямо на Windows за то, что она не позволяет вам загружать код библиотеки из памяти, а не из файла.