load -
裝載機器程式碼並初始化新命令。
load fileName
load fileName packageName
load fileName packageName interp
這個命令把二進位制程式碼從一個檔案裝載到應用的地址空間中並呼叫在包(package)中的初始化過程來把它加入到直譯器中。
fileName
是包含程式碼的檔案的名字;它準確的形式在不同的系統上是不同的,但在多數系統上是一個共享庫,例如,在
Solaris 下的
.so 檔案或在 Windows
下的一個 DLL。
packageName
是包的名字,並被用於計算初始化過程的名字。
interp
是要在其中裝載包的直譯器的路徑名(詳情參見
interp
手冊條目);如果省略了
interp
,它的預設是在其中呼叫
load
命令的那個直譯器。
一旦已經被裝載到應用的地址空間中,兩個初始化過程之一將在新程式碼中被呼叫。典型的,初始化程序將向一個
Tcl
直譯器新增新命令。初始化過程的名字由
packageName
和目標直譯器是否是安全直譯器來確定。對於通常的直譯器,初始化過程的名字的形式是
pkg_Init,這裡
pkg 與
packageName
相同,但是第一個字母被轉換成大寫而所有其他字母被轉換成小寫。例如,如果
packageName 是
foo 或
FOo,則初始化過程的名字將是
Foo_Init。
如果目標直譯器是一個安全直譯器,則初始化過程的名字將是
pkg_SafeInit 而不是
pkg_Init。寫
pkg_SafeInit
函式要仔細,在包中提供的功能中,只用由不可信任的程式碼使用是安全的的那部分初始化安全直譯器。
關於 Safe-Tcl
的詳細的資訊,請參見
safe 手冊條目。
初始化過程必須匹配下列原型
(prototype):
typedef int Tcl_PackageInitProc(Tcl_Interp * interp);
interp
引數標識在其中裝載包的直譯器。初始化過程必須返回
TCL_OK 或
TCL_ERROR
來指示是否成功完成;在有錯誤的情況下,應把直譯器的結果設定為指向一個錯誤訊息。初始化過程返回的結果就是
load 命令的結果。
在一個應用中對每個
fileName
只進行一次檔案的實際裝載。如果一個給定的
fileName
被裝載到多個直譯器中,則第一個
load
將裝載程式碼並呼叫初始化過程;隨後的
load
將呼叫初始化過程而不再次裝載程式碼
。不可能解除安裝或過載一個包。
load
命令還支援同應用靜態連線的包,條件是這些包已經透過呼叫
Tcl_StaticPackage
過程註冊過了。如果
fileName
是一個空串,則必須指定
packageName 。
如果省略了
packageName
或被指定為一個空串,Tcl
嘗試著猜出包的名字。在不同的平臺上可能是不同的。在多數
UNIX
平臺上,預設的猜測是接受
fileName
的最後的組成部分,如果前三個字元是
lib
就去掉它們,使用所有隨後的
字母和下劃線作為模組的名字。
例如,命令
load libxyz4.2.so
使用模組名
xyz 而命令
load bin/last.so {} 使用模組名
last。
如果
fileName
是一個空串,則必須指定
packageName。
load
命令首先用這個名字查詢一個靜態裝載包(透過呼叫
Tcl_StaticPackage
過程註冊的包);如果找到了就使用它。否則,
load
命令用這個名字查詢動態裝載包,如果找到就使用它。如果一些不同的檔案被裝載成包的不同版本,Tcl
選擇被最先裝載的檔案。
-
Windows
- 在裝載出現 "library not
found"
錯誤的時候,也有可能是沒找到一個依賴庫。要檢視依賴庫,在一個
DOS 控制檯中“dumpbin -imports
<dllname>”來檢視必須匯入那些庫。在當前目錄中裝載一個
DLL 的時候,Windows
將忽略作為一個路徑指定符(specifier)的“./”,轉而使用一次啟發式(heuristic)的查詢來找到這個
DLL。要避免如此,裝載DLL
就要用
load [file join [pwd] mylib.DLL]
如果以不同的
fileNames
裝載同一個檔案,它將被多次載入這個程序的地址空間。在不同的系統上裝載的行為是不同的(一些系統可以檢測多餘的裝載,其他的可能不能)。
info sharedlibextension,
Tcl_StaticPackage(3),
safe(n)
binary code, loading, safe interpreter, shared library
寒蟬退士
2001/08/30
http://cmpp.linuxforum.net
本頁面中文版由中文 man
手冊頁計劃提供。
中文 man 手冊頁計劃:
https://github.com/man-pages-zh/manpages-zh