Ткл Старкит с MySql - PullRequest
       14

Ткл Старкит с MySql

2 голосов
/ 16 декабря 2009

Кто-нибудь знает, какие файлы требуются для работы MySql с Tcl Starkit? В настоящее время у меня есть libmySQL.dll, libmysqltcl.dll и pkgIndex.tcl. Файл pkgIndex.tcl имеет следующий код:

proc loadmysqltcl {dir} {
   set oldcwd [pwd]
   cd $dir
   load libmysqltcl[info sharedlibextension]
   cd $oldcwd
  }

package ifneeded mysqltcl 3.03 [list loadmysqltcl $dir]

Эти файлы находятся в моей папке lib приложения Tcl. Пока что, после того, как я заверну свое приложение и запустлю exe. файл, я получаю сообщение об ошибке:

не удалось загрузить библиотеку «C: / ... TCL1055.tmp»: не удалось найти эту или зависимую библиотеку в пути к библиотеке во время выполнения «load libmysqltcl [info sharedlibextension]»

Кроме того, я замечаю, что отсутствующий файл .tmp меняется каждый раз, когда я пытаюсь запустить свое приложение.

Кто-нибудь имел успех с Tcl / MySql starkit (для Windows)?

Спасибо

DFM

1 Ответ

6 голосов
/ 16 декабря 2009

Starkits использует некоторые хитрые трюки, чтобы иметь возможность загружать библиотеки, которые хранятся в виртуальной файловой системе, связанной с самим starkit. В Unix вы можете указать загрузчику библиотеки ОС загружать библиотеку из произвольного блока данных, но в Windows вы можете загружать библиотеки только из реальных файлов на диске.

Чтобы учесть это ограничение, Windows-старкиты сначала копируют библиотеку из виртуальной файловой системы в реальную файловую систему в виде временного файла. Отсюда и имена временных файлов.

Теперь все это прекрасно работает, если библиотеки в вашем старките не имеют зависимостей от других библиотек в вашем старките. В вашем случае ваш libmysqltcl.dll, вероятно, зависит от libmySQL.dll. Во время загрузки оба из них были скопированы в реальную файловую систему, но с именами временных файлов, поэтому загрузчик не может найти libmySQL.dll.

У вас есть пара вариантов для решения этой проблемы:

  1. Устраните эти зависимости второго уровня из ваших библиотек. В этом случае это означает пересоздание libmysqltcl.dll со статической связью с содержимым в libmySQL.dll, а не динамическое связывание его с DLL.

  2. Прежде чем пакет потребует в вашем сценарии запуска, явно скопируйте зависимости второго уровня из вашего 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 за то, что она не позволяет вам загружать код библиотеки из памяти, а не из файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...