Как сообщить TCL и TK, что языковые файлы по умолчанию `.tcl` следует искать локально?

При компиляции 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, эта DLL ищет все файлы TCL / TK относительно их (для DLL) каталога ../lib/tk8.5 и ../lib/tcl8. 5. Это затрудняет распространение вашего приложения без необходимости заставлять конечных пользователей устанавливать TCL и TK.

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

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

Я хочу сделать это возможным, чтобы конечным пользователям не приходилось устанавливать TCL и TK. Я хочу предоставить им папки с исходными файлами TK и TCL .TCL, которые будут расположены в каком-то каталоге относительно моего приложения, например extras/TCL и extras/TK. Как указать DLL TK и TCL, где находятся папки с исходными файлами? каковы имена функций API TK и TCL для этого? Есть ли для этого какие-то специальные функции 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 для получения строки char.


person Rella    schedule 01.07.2011    source источник
comment
Почему этот вопрос помечен как c?   -  person Lightness Races in Orbit    schedule 02.07.2011
comment
Tcl и TK имеют API C, которые мы используем в c ++   -  person Rella    schedule 02.07.2011
comment
Но ваш вопрос касается C ++.   -  person Lightness Races in Orbit    schedule 02.07.2011
comment
TCL_LOCAL_MAIN_HOOK действительно имеет смысл только в Windows (он существует только в Unix из соображений симметрии), и то только потому, что он позволяет вам искать main() после преобразования командной строки в реальные слова ( т.е. проблема, которой нет у платформ Unix). Но я не знаю, почему вы на самом деле практически хотите перехватить в этот момент; это не для неспециалистов IMO (и мне это никогда не было нужно).   -  person Donal Fellows    schedule 02.07.2011
comment
@Kiss: Не добавляйте второй вопрос к первому.   -  person Lightness Races in Orbit    schedule 02.07.2011
comment
@Kiss: задавайте по одному вопросу на каждый вопрос. Если вы не можете в уме разобраться, где заканчивается один Q и начинается другой, разумно ли ожидать, что все остальные сделают это за вас?   -  person Donal Fellows    schedule 02.07.2011
comment
@all - это один вопрос - простой - как поднять tcl \ tk dll, где находятся файлы main \ default. Чтобы иметь возможность распространять свое приложение. Кстати, структура TCL \ TK такая же, как и на других платформах - Mac OS и Linux (при компиляции вручную).   -  person Rella    schedule 05.07.2011


Ответы (1)


Если у вас есть каталог, содержащий ваш двоичный файл, и вы хотите найти эти файлы 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] (хотя с этим есть некоторые оговорки).


[РЕДАКТИРОВАТЬ]: Чтобы заставить этот код работать с 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 и предположении. Будьте осторожны.

person Donal Fellows    schedule 01.07.2011
comment
Обратите внимание, что glob возвращает список файлов в неопределенном порядке (фактически в том порядке, в котором их перечисляет ОС, который зависит от всех видов факторов), поэтому используйте lsort в этом списке файлов, если вы хотите читать их в предсказуемом порядке. - person Donal Fellows; 02.07.2011
comment
И «сообщить Tcl, где находятся файлы» выполняется с использованием полных путей. Существует концепция пакетов, которые можно хранить в группах, но это идея более высокого уровня. - person Donal Fellows; 02.07.2011
comment
Я обнаружил, что на самом деле все, что вам нужно сделать, чтобы выполнить то, что я просил, - это настроить некоторые переменные среды TCL_LIBRARY и TK_LIBRARY. Thay можно установить относительно значений вашего приложения. - person Rella; 09.07.2011