1

のすべての ActiveTcl パッケージのパッケージの自動読み込みを有効にする C++ アプリケーションを作成したいと考えていますC:\Tcl\lib。以下の tcl コマンドをTcl_Eval()C++ コードに渡します。package require <package name>そして、" " が自動的にパッケージを見つけてロードすることを期待します。

set ::auto_path [file join {C:\Tcl\lib}]

しかし、TCL シェルで行うようには機能しませんでした。TCL シェルはpkgIndex.tclauto_path を検索するため、" package require" の場合、適切なパッケージまたは共有ライブラリを見つけることができます。C++ アプリケーションで動作させることは可能ですか? または何か良い方法はありますか?

4

1 に答える 1

0

OK、問題が何であるかはわかっていると思います。はディレクトリauto_pathTcl リストです — それを使用するコードはリストを反復処理しますforeach— パッケージ (および自動ロードされたスクリプト、私が考える古いメカニズムは価値があるよりもむしろ面倒です) を検索します。それでも、あなたはその出力である単一の要素を使用していますfile join。これは通常、Windows 以外のプラットフォームでは問題になりません。ディレクトリ セパレーターが/存在するためです (これは、Tcl にとって通常の非空白文字にすぎません) \

これは何を意味するのでしょうか?さて、その後:

set ::auto_path [file join {C:\Tcl\lib}]

そのリストの内容を尋ねることができます。たとえば、リストの最初の要素を出力できます…</p>

puts [lindex $::auto_path 0]

それは何を出力しますか?おそらくこれ:

C:Tcllib

おっと!バックスラッシュは引用文字として解釈され、完全に機能しないパスが残ります。それはうまくいきません。

修正は、別の方法を使用してauto_path. これで実際に必要なことがわかると思います:

set ::auto_path [list {C:\Tcl\lib}]

これは別の方法ですが (まだ を使用していlistます。すべての場合においてトラブルのないリスト構築に最適です):

set ::auto_path [list [file normalize {C:\Tcl\lib}]]

(私の賭けは、あなたがfile joinゲットー として使用しようとしているということですfile normalize。そうしないでください。特に、実際にあなたが望むことを行うコマンドがある今では、それは長い間お粗末なやり方でした.)

于 2015-08-20T14:10:22.447 に答える