Tcl Starkit с MySql

Кто-нибудь знает, какие файлы требуются 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


person DFM    schedule 16.12.2009    source источник


Ответы (1)


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

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

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

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

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

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

Тогда вы сможете выполнить package require должным образом.

Это, конечно, немного неуклюже, но вина лежит на Windows, которая не позволяет загружать библиотечный код из памяти, а не из файла.

person Eric Melski    schedule 16.12.2009
comment
Спасибо, Эрик - я попробовал вариант номер 2, но безуспешно. Я разместил ваш код ниже package require mysqltcl в моем приложении. Затем я завернул его и безуспешно попытался запустить. Я также поместил ваш код в файл pkgIndex.tcl с включенным кодом и без него, и он не работал. Похоже, ваш ответ должен сработать, поэтому я думаю, что делаю что-то не так. Кроме того, я изменил myapp на настоящее имя приложения, которым является Small_Business_Database_application. Надеюсь, подчеркивание в названии не повлияло на мои результаты. У Вас есть какие-то предложения? Спасибо, DFM - person DFM; 16.12.2009
comment
Этот код должен появиться до того, как пакет потребует. Кроме того, если вы поместите этот код в процесс, обязательно измените $ env (TEMP) на $ :: env (TEMP). - person Eric Melski; 16.12.2009
comment
Спасибо за продолжение. Я действительно ценю твою помощь. Теперь все работает нормально. С уважением, DFM - person DFM; 17.12.2009