Как сказать TCL и TK, что языковые файлы по умолчанию `.tcl` должны быть найдены локально? - PullRequest
1 голос
/ 02 июля 2011

Когда вы компилируете TCL / Tk вручную из источников или просто устанавливаете его из ActiveState , вы получаете следующую структуру в папке установки TCL / Tk:

  +- bin
       +- tcl85.dll
       +- tk85.dll
  //...
  +- lib/
       +- tcl8.5/
            //All TCL files (.tcl)
       +- tk8.5/
            //All TK files (.tcl)
  //...

Так что, когда вы компилируете какое-то свое приложение и связываете его с библиотеками TCL и TK, эта DLL ищет все файлы TCL / TK относительно каталога tham (для DLL) ../lib/tk8.5 и ../lib /tcl8.5. Это затрудняет распространение вашего приложения, не заставляя конечных пользователей устанавливать TCL и TK.

Я хочу распространить свое приложение на C ++.

Я использую CPPTK для макета GUI по умолчанию.

Я хочу, чтобы у конечных пользователей не было необходимости устанавливать TCL и TK. Я хочу предоставить им папки с исходными файлами TK и TCL .TCL, которые будут расположены в каком-то каталоге относительно моего приложения, например extras/TCL и extras/TK. Как сказать TK и TCL DLL, где находятся эти папки с исходными файлами? для чего нужны имена функций TK и TCL API? Для этого есть специальные функции cpptk?

Обновление Итак, я попытался Donal Fellows ответить со следующей структурой папок.

app/
  +- app.exe
  +- tcl85.dll
  +- tk85.dll
  +- extras/
       +- tcl/
            //All TCL files you can find in TCL install folder/ lib/tcl8.5
       +- tk/
            //All TK files you can find in TCL install folder/ lib/tk8.5

Мой код выглядел так:

#include <stdio.h>
#include "cpptk/cpptk.h"
using namespace Tk;
int main(int, char *argv[])
{
static char* str = "set extrasDir [file dirname [info nameofexecutable]]/extras\n"
"# Now use it to load some code...\n"
"source $extrasDir/tcl/init.tcl\n"
"# Another way to load code, using all *.tk files from a directory:\n"
"foreach tkFile [glob -nocomplain -directory $extrasDir/tk *.tk] {\n"
"    source $tkFile\n"
"}\n";
// This next part is in a function or method...
//std::string script("the script to evaluate goes here");
std::string result = Tk::details::Expr(str,true); // I think this is correct
std::cout<< result << std::endl;
std::cin.get();
Tk::init(argv[0]);
button(".b") -text("Say Hello");
pack(".b") -padx(20) -pady(6);
Tk::runEventLoop();
std::cin.get();
}

Компилируется, но не работает в строке 36 файла cpptkbase.cc

Кстати: я использовал это приложение html \ js, чтобы получить строку символов.

1 Ответ

1 голос
/ 02 июля 2011

Если у вас есть каталог, содержащий ваш двоичный файл, и вы хотите расположить эти Tcl-файлы относительно него, например:

yourapp1.0/
  +- yourapp.exe
  +- extras/
       +- tcl/
            +- foo.tcl
            +- bar.tcl
       +- tk/
            +- grill.tk

Затем вы можете написать код Tcl для поиска этих скриптов. Этот код будет выглядеть так:

set extrasDir [file dirname [info nameofexecutable]]/extras
# Now use it to load some code...
source $extrasDir/tcl/foo.tcl
source $extrasDir/tcl/bar.tcl
# Another way to load code, using all *.tk files from a directory:
foreach tkFile [glob -nocomplain -directory $extrasDir/tk *.tk] {
    source $tkFile
}

Если вы используете скрипт в качестве основной программы, но в остальном настроены в структуре, как указано выше, вы бы использовали $argv0 (специальную глобальную переменную) вместо [info nameofexecutable]. Или, возможно, [info script] (хотя с этим есть некоторые оговорки).


[EDIT]: чтобы этот код работал с C ++ / Tk, вам нужно быть хитрее. В частности, вам нужно получить доступ к некоторым дополнительным возможностям:

#include "cpptk.h" // might need "base/cpptkbase.h" instead
#include <string>

// This next part is in a function or method...
std::string script("the script to evaluate goes here");
std::string result = Tk::details::Expr(script,true); // I think this is correct

Я должен предупредить, что я не пишу на C ++ очень часто, поэтому есть большая вероятность, что это не сработает; это просто основано на чтении исходного кода C ++ / Tk и предположении. Предостережение emptor .

...