2011-07-01 1 views
1

TCL/TK에 manually from sources하거나 install it from ActiveState 당신이 당신의 TCL/TK에 설치 폴더에 다음과 같은 구조를 얻을 : 당신은 DLL의를 당신의 일부 응용 프로그램을 컴파일하고 TCL에 연결하고 TK DLL의 그 그래서TCL과 TK에게 어떻게 기본 '.tcl` 언어 파일을 로컬에서 검색해야하는지 알려주고 싶습니다. 컴파일

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

tham (DLL의) 디렉토리 ../lib/tk8.5 및 ../lib/tcl8.5와 관련된 모든 TCL/TK 파일을 검색합니다. 따라서 최종 사용자가 TCL 및 TK를 설치하지 않아도되므로 앱을 배포하는 것이 매우 어렵습니다.

내 C++ 응용 프로그램을 배포하고 싶습니다.

기본 GUI 레이아웃에 CPPTK을 사용합니다.

최종 사용자가 TCL 및 TK를 설치할 필요가 없도록 가능하게 만들고 싶습니다. 나는 그들에게 extras/TCLextras/TK과 같은 내 디렉터리에있는 TK와 TCL .TCL 소스 파일을 폴더에 제공하려고한다. 해당 소스 파일 폴더가있는 TK 및 TCL DLL을 어떻게 알 수 있습니까? 그 일을하기 위해 TK 및 TCL API 함수 이름은 무엇입니까? 거기에 특별한 cpptk 기능이 있습니까?

업데이트 그래서 나는 다음 폴더 구조와 Donal Fellows answer를 시도했다. 그것은 cpptkbase.cc 라인 (36)에도 실패한 제외한 컴파일

#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(); 
} 

BTW : 같은

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 

내 코드는 모습이 들어있는 디렉토리가 있다면 나는 this html\js app to get char string.

+0

이 질문에 'c'태그가 붙은 이유는 무엇입니까? –

+0

Tcl과 TK에는 C++에서 사용하는 C++가 있습니다. – Rella

+0

하지만 C++에 관한 질문입니다. –

답변

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 소스를 읽고 추측을 기반으로합니다. 경고 셉터.

+0

'glob'는 지정되지 않은 순서로 파일 목록을 반환합니다 (사실 OS가 나열하는 순서입니다. 모든 종류의 요소에 따라 다름). 그래서 파일 목록을 읽을 때'lsort'를 사용하십시오 예측 가능한 순서. –

+0

그리고 "Tcl에게 파일이 어디에 있는지"는 전체 경로 이름을 사용하여 수행됩니다. 그룹으로 저장 될 수있는 패키지의 개념이 있지만 더 높은 수준의 아이디어입니다. –

+0

새 게시물 업데이트를 확인하십시오. – Rella