Когда вы компилируете 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, чтобы получить строку символов.