2011-07-01 5 views
1

あなたはTCL/Tkのmanually from sourcesをコンパイルするか、単にinstall it from ActiveStateすると、あなたのTCL/Tkのインストールフォルダに次のような構造を得る:TCLとTKに、デフォルトの `.tcl`言語ファイルをローカルで検索する方法を教えてください。

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

だから、あなたはあなたのいくつかのアプリをコンパイルし、DLLのことをTCLとTK DLLのにリンクする場合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を試してみました。

のように私のコードを見
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 

:それはcpptkbase.ccところで

のライン36にfailesに過ぎずコンパイル

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

:あなたが含まれているディレクトリを持っている場合、私は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

"どこにファイルがあるかを伝える"というのは、完全なパス名を使って行われます。そこにグループの中に保存することができるパッケージの概念がありますが、それらはより高いレベルのアイデアです。 –

+0

新しい投稿の更新を見てください。 – Rella

関連する問題