2013-05-10 104 views
0

好的,所以我們使用LabWindows爲Tcl 8.4編寫了一個擴展。升級到Tcl 8.6後,調用由dll生成的任何過程都會導致希望崩潰而不產生有用的錯誤代碼。這發生在腳本和手動加載庫並從wish shell中調用一個過程。升級到Tcl 8.6後LabWindows內置的Tcl內建C擴展

現在,只有當我在8.4上安裝Tcl 8.6時纔會發生這種情況。如果我重新安裝8.6,它說dll缺少一個依賴庫。因此,我使用依賴walker來查看dll依賴於tcl84.dll,而使用Visual Studio(VS),甚至其他舊LabWindows項目所做的擴展也沒有列爲依賴項。

任何沒有將tcl84.dll列爲依賴項目的項目(如您所期望的那樣)可以在Tcl 8.6上正常運行,既可以全新安裝,也可以安裝在8.4以上。

那麼有沒有人有任何想法,爲什麼擴展是依賴於tcl84.dll時,其他人不是?

這裏的源:

SI.c只到init方法(整個文件過大)

#include <analysis.h> 
#include "toolbox.h" 
#include <utility.h> 
#include <ansi_c.h> 
#include "SI.h" 

//////////////////////////////////////////////////////////////////////////////////////////////////// 
int DLLEXPORT Si_Init(Tcl_Interp *interp) { 
//////////////////////////////////////////////////////////////////////////////////////////////////// 

    if (Tcl_InitStubs(interp, "8.4", 0) == NULL) { 
     return TCL_ERROR; 
    } 

    //TCL Exported Functions 
    Tcl_CreateObjCommand(interp, "LoadWfm", (Tcl_ObjCmdProc*)LoadWfm,(ClientData)NULL, (Tcl_CmdDeleteProc *)NULL); 
    Tcl_CreateObjCommand(interp, "SaveWfm", (Tcl_ObjCmdProc*)SaveWfm,(ClientData)NULL, (Tcl_CmdDeleteProc *)NULL); 
    Tcl_CreateObjCommand(interp, "Step2SParam", (Tcl_ObjCmdProc*)Step2SParam,(ClientData)NULL, (Tcl_CmdDeleteProc *)NULL); 
    Tcl_CreateObjCommand(interp, "Step2Eye", (Tcl_ObjCmdProc*)Step2Eye,(ClientData)NULL, (Tcl_CmdDeleteProc *)NULL); 

    Tcl_PkgProvide(interp, "SI", "1.0"); 

    return TCL_OK; 
} 

SI.h

//Exported Functions 
int DLLEXPORT Si_Init(Tcl_Interp *interp); 
int DLLEXPORT LoadWfm(ClientData clientData, Tcl_Interp *interp,int objc, Tcl_Obj *CONST objv[]); 
int DLLEXPORT SaveWfm(ClientData clientData, Tcl_Interp *interp,int objc, Tcl_Obj *CONST objv[]); 
int DLLEXPORT Step2SParam(ClientData clientData, Tcl_Interp *interp,int objc, Tcl_Obj *CONST objv[]); 
int DLLEXPORT Step2Eye(ClientData clientData, Tcl_Interp *interp,int objc, Tcl_Obj *CONST objv[]); 

//Local Functions 
int StepToSParam (double *vin, double *vout, double dt, int N, double **S_real_out, double **S_imag_out, double *S_f0_out, double *S_df_out, int *S_N_out); 
double RisetimeToBandwidth_20_80(double x); 
double RisetimeToBandwidth_10_90(double x); 
int GaussianFilter(double *Waveform, int Samples, double SampleTime, int BitPoints, double Bandwidth); 
int NormalizeAmplitude (double *Waveform, int Samples, double Vpp); 
int FunctionGenerator(int BitPattern[], int PatternLength, int PatternCycles, double Freq, double Vpp, double Risetime, 
         int Risetime2080, double dt, int *Samples, double **Waveform); 
int ZeroPad (double **wfm, int N, int NewN); 
int ParZ(double Z1_Re, double Z1_Im, double Z2_Re, double Z2_Im, double *ZT_Re, double *ZT_Im); 
int ReflCoef(double Z1_Re, double Z1_Im, double Z2_Re, double Z2_Im, double *ZRefl_Re, double *ZRefl_Im); 
int SixCompEq(double f, double Zcab, double Rld, double R1, double C, double R3, double L, double *T_Re, double *T_Im); 
int FourCompEq(double f, double Zcab, double Rld, double R1, double C, double R3, double L, double *T_Re, double *T_Im); 
int ApplyEq(int NumComponents, int EQ_N, double df, double Zcab, double Rld, double R1, 
    double C, double R3, double L, double *T_Re, double *T_Im); 
int SimulateEye (double *in, double *out, int N, double dt, 
       char *Pattern_String, int Pattern_Inverted, int Pattern_Cycles, double Pattern_BitRate, 
       double Pattern_Risetime, int Pattern_2080, double Pattern_Amplitude, 
       int EQ_NumComponents, double EQ_Zcab, double EQ_Rld, double EQ_R1, double EQ_C, double EQ_R3, double EQ_L, 
       double **Eye_Pattern, double *Eye_dt, int *Eye_N); 
int FindPatternStartIndex(double *EyeWfm, double Eye_dt, int Eye_N, double Pattern_Bitrate, int Pattern_Bits, int Pattern_Cycles); 

如果有人熟悉使用LabWindows,下面是項目設置文件:

SI.prj

[Project Header] 
Version = 800 
Pathname = "/c/CVS_CHECKOUT/MHTS/SI/SI.prj" 
CVI Dir = "/c/program files/national instruments/cvi80" 
IVI Standard Root Dir = "/C/Program Files/IVI" 
VXIplug&play Framework Dir = "/C/VXIPNP/winnt" 
Number of Files = 4 
Target Type = "Dynamic Link Library" 
Flags = 16 

[File 0001] 
File Type = "Include" 
Res Id = 1 
Path Is Rel = True 
Path Rel To = "Project" 
Path Rel Path = "../Include/molex_tcl.h" 
Path = "/c/CVS_CHECKOUT/MHTS/Include/molex_tcl.h" 
Exclude = False 
Project Flags = 0 
Folder = "Included Files" 

[File 0002] 
File Type = "CSource" 
Res Id = 2 
Path Is Rel = True 
Path Rel To = "Project" 
Path Rel Path = "SI.c" 
Path = "/c/CVS_CHECKOUT/MHTS/SI/SI.c" 
Exclude = False 
Compile Into Object File = False 
Project Flags = 0 
Folder = "Source Files" 

[File 0003] 
File Type = "Include" 
Res Id = 3 
Path Is Rel = True 
Path Rel To = "Project" 
Path Rel Path = "SI.h" 
Path = "/c/CVS_CHECKOUT/MHTS/SI/SI.h" 
Exclude = False 
Project Flags = 0 
Folder = "Source Files" 

[File 0004] 
File Type = "Library" 
Res Id = 4 
Path Is Rel = True 
Path Rel To = "Project" 
Path Rel Path = "../Include/tclDecls.lib" 
Path = "/c/CVS_CHECKOUT/MHTS/Include/tclDecls.lib" 
Exclude = False 
Project Flags = 0 
Folder = "Included Files" 

[Folders] 
Include Files Folder Not Added Yet = True 
User Interface Files Folder Not Added Yet = True 
Instrument Files Folder Not Added Yet = True 
Folder 0 = "Source Files" 
Folder 1 = "Included Files" 

[Compiler Options] 
Default Calling Convention = "cdecl" 
Require Prototypes = True 
Require Return Values = True 
Enable Pointer Mismatch Warning = False 
Enable Unreachable Code Warning = False 
Enable Unreferenced Identifiers Warning = False 
Enable Assignment In Conditional Warning = False 
O Option Compatible With 5.0 = False 
Uninitialized Locals Compile Warning = "Conservative" 

[Run Options] 
Stack Size = 250000 
Image Base Address = 4194304 

[Compiler Defines] 
Compiler Defines = "/DWIN32_LEAN_AND_MEAN /D_MSC_VER=1200 /D_WINDEF_" 

[Include Paths] 
Include Path 1 Is Rel = False 
Include Path 1 = "/c/CVS_CHECKOUT/MHTS/Include" 
Include Path 2 Is Rel = False 
Include Path 2 = "/c/Tcl/include" 

[Create Executable] 
Executable File_Debug Is Rel = True 
Executable File_Debug Rel To = "Project" 
Executable File_Debug Rel Path = "SI_dbg.dll" 
Executable File_Debug = "/c/CVS_CHECKOUT/MHTS/SI/SI_dbg.dll" 
Executable File_Release Is Rel = True 
Executable File_Release Rel To = "Project" 
Executable File_Release Rel Path = "SI.dll" 
Executable File_Release = "/c/CVS_CHECKOUT/MHTS/SI/SI.dll" 
Icon File Is Rel = False 
Icon File = "" 
Application Title = "" 
DLL Exports = "Symbols Marked As Export" 
DLL Import Library Choice = "Gen Lib For Current Mode" 
Use IVI Subdirectories for Import Libraries = False 
Use VXIPNP Subdirectories for Import Libraries = False 
Use Dflt Import Lib Base Name = True 
Where to Copy DLL = "Do not copy" 
Add Type Lib To DLL = False 
Include Type Lib Help Links = False 
Type Lib FP File Is Rel = False 
Type Lib FP File = "" 
Type Lib Guid = "" 
Runtime Support = "Full Runtime Support" 
Instrument Driver Support Only = False 
Embed Project .UIRs = False 
Generate Map File = False 

[External Compiler Support] 
UIR Callbacks File Option = 0 
Using LoadExternalModule = False 
Create Project Symbols File = True 
UIR Callbacks Obj File Is Rel = False 
UIR Callbacks Obj File = "" 
Project Symbols H File Is Rel = False 
Project Symbols H File = "" 
Project Symbols Obj File Is Rel = False 
Project Symbols Obj File = "" 

[ActiveX Server Options] 
Specification File Is Rel = False 
Specification File = "" 
Source File Is Rel = False 
Source File = "" 
Include File Is Rel = False 
Include File = "" 
IDL File Is Rel = False 
IDL File = "" 
Register ActiveX Server = False 

[tpcSection] 
tpcEnabled = 0 
tpcOverrideEnvironment = 0 

SI.cws

[Workspace Header] 
Version = 800 
Pathname = "/c/CVS_CHECKOUT/MHTS/SI/SI.cws" 
CVI Dir = "/c/program files/national instruments/cvi80" 
IVI Standard Root Dir = "/C/Program Files/IVI" 
VXIplug&play Framework Dir = "/C/VXIPNP/winnt" 
Number of Projects = 1 
Active Project = 1 
Project 0001 = "SI.prj" 
Drag Bar Left = 323 
Window Top = 137 
Window Left = 1190 
Window Bottom = 1041 
Window Right = 2278 
Maximized = True 
Maximized Children = True 
Max Number Of Errors = 20 
Track Include File Dependencies = True 
Prompt For Missing Includes = True 
Stop On First Error File = False 
Bring Up Err Win For Warnings = True 
Show Build Dialog = False 
Save Changes Before Running = "Always" 
Hide Windows = False 
Global Hot Key = False 
Break At First Statement = False 
Sort Type = "File Name" 
Number of Opened Files = 3 
Window Confinement Region Enabled = True 
MainColumnWidth = 304 
FileDateColumnWidth = 70 
FileSizeColumnWidth = 70 
StatusColumnWidth = 70 

[Project Header 0001] 
Version = 800 
Don't Update DistKit = False 
Platform Code = 4 
Build Configuration = "Release" 
Warn User If Debugging Release = 1 
Batch Build Release = False 
Batch Build Debug = False 
Force Rebuild = False 

[File 0001] 
Path = "/c/CVS_CHECKOUT/MHTS/SI/SI.c" 
File Type = "CSource" 
Disk Date = 3288546022 
In Projects = "1," 
Window Top = 163 
Window Left = 78 
Window Z-Order = 1 
Source Window State = "1,191,191,191,54,55,55,0,0,116,0,25,0,25,0,51,150,0,192,6,349,676,1,0," 
Breakpoint 0001 = "166,0,enabled," 
Breakpoint 0002 = "195,0,enabled," 

[File 0002] 
Path = "/c/CVS_CHECKOUT/MHTS/SI/SI.h" 
File Type = "Include" 
Disk Date = 3262700601 
In Projects = "1," 
Window Top = 30 
Window Left = 6 
Window Z-Order = 2 
Source Window State = "1,27,28,27,0,0,0,0,0,80,0,28,0,28,0,25,0,45,27,130,349,676,1,0," 

[File 0003] 
Path = "/c/CVS_CHECKOUT/MHTS/Include/molex_tcl.h" 
File Type = "Include" 
Disk Date = 3275700706 
In Projects = "1," 
Window Top = 30 
Window Left = 6 
Window Z-Order = 3 
Source Window State = "1,15,16,16,86,159,159,0,0,80,0,0,0,0,0,25,0,0,35,33,349,676,1,0," 

[File 0004] 
Path = "/c/CVS_CHECKOUT/MHTS/Include/tclDecls.lib" 
File Type = "Library" 
Disk Date = 3262622625 
In Projects = "1," 

[Build Options 0001] 
Generate Browse Info = True 
Enable Uninitialized Locals Runtime Warning = True 
Debugging Level = "Standard" 
Break On Library Errors = False 
Break On First Chance Exceptions = False 
Execution Target Address = "Local desktop computer" 
Execution Target Port = 0 
Execution Target Type = 0 

[SCC Options 0001] 
Use global settings = True 
SCC Provider = "" 
SCC Project = "" 
Local Path = "" 
Auxiliary Path = "" 
Perform Same Action For .h File As For .uir File = "Ask" 
Username = "" 
Comment = "" 
Use Default Username = False 
Use Default Comment = False 
Suppress CVI Error Messages = False 

[DLL Debugging Support 0001] 
External Process Path = "/c/Tcl/bin/wish.exe" 

[DLLs Used By Executable 0001] 
DLL 0001 = "/C/Tcl/bin/tcl84.dll" 

[Command Line Args 0001] 
Command Line Args = "" 

最有前途的可能性看起來是該線路.cws文件:

[DLLs Used By Executable 0001] 
DLL 0001 = "/c/Tcl/bin/tcl84.dll" 

但這裏是從其他的LabWindows項目.cws文件:

OK.cws

[Workspace Header] 
Version = 800 
Pathname = "/c/CVS_CHECKOUT/MHTS/OK/OK.cws" 
CVI Dir = "/c/program files/national instruments/cvi80" 
IVI Standard Root Dir = "/C/Program Files/IVI" 
VXIplug&play Framework Dir = "/C/VXIPNP/winnt" 
Number of Projects = 1 
Active Project = 1 
Project 0001 = "OK.prj" 
Drag Bar Left = 181 
Window Top = 101 
Window Left = 1404 
Window Bottom = 974 
Window Right = 2676 
Maximized = True 
Maximized Children = True 
Max Number Of Errors = 20 
Track Include File Dependencies = True 
Prompt For Missing Includes = True 
Stop On First Error File = False 
Bring Up Err Win For Warnings = True 
Show Build Dialog = False 
Save Changes Before Running = "Always" 
Hide Windows = False 
Global Hot Key = False 
Break At First Statement = False 
Sort Type = "File Name" 
Number of Opened Files = 1 
Window Confinement Region Enabled = True 
MainColumnWidth = 162 
FileDateColumnWidth = 70 
FileSizeColumnWidth = 70 
StatusColumnWidth = 70 

[Project Header 0001] 
Version = 800 
Don't Update DistKit = False 
Platform Code = 4 
Build Configuration = "Debug" 
Warn User If Debugging Release = 1 
Batch Build Release = False 
Batch Build Debug = False 
Force Rebuild = False 

[File 0001] 
Path = "/c/CVS_CHECKOUT/MHTS/OK/OK.c" 
File Type = "CSource" 
Disk Date = 3291811857 
In Projects = "1," 
Window Top = 59 
Window Left = 80 
Window Z-Order = 1 
Source Window State = "1,503,503,503,14,32,32,0,0,133,0,37,0,51,29,59,478,0,514,78,663,815,1,0," 

[File 0002] 
Path = "/c/CVS_CHECKOUT/MHTS/Include/molex_tcl.h" 
File Type = "Include" 
Disk Date = 3275700706 
In Projects = "1," 
Window Top = 48 
Window Left = 18 
Source Window State = "1,8,9,8,0,0,0,0,0,0,0,0,0,0,0,0,1,0,8,12,461,988,1,0," 

[File 0003] 
Path = "/c/CVS_CHECKOUT/MHTS/OK/OK.h" 
File Type = "Include" 
Disk Date = 3291811853 
In Projects = "1," 
Window Top = 614 
Window Left = 299 
Source Window State = "1,4,4,4,17,21,17,0,0,0,0,16,0,16,0,0,0,0,15,17,278,676,1,0," 

[File 0004] 
Path = "/c/Program Files/Opal Kelly/FrontPanel/API/okFrontPanelDLL.h" 
File Type = "Include" 
Disk Date = 3268500132 
In Projects = "1," 
Window Top = 130 
Window Left = 11 
Source Window State = "1,218,218,218,51,68,51,0,3,0,0,0,0,0,0,0,197,0,218,68,476,725,1,0," 

[File 0005] 
Path = "/c/CVS_CHECKOUT/MHTS/Include/tclDecls.lib" 
File Type = "Library" 
Disk Date = 3262622625 
In Projects = "1," 

[Build Options 0001] 
Generate Browse Info = True 
Enable Uninitialized Locals Runtime Warning = True 
Debugging Level = "Standard" 
Break On Library Errors = False 
Break On First Chance Exceptions = False 
Execution Target Address = "Local desktop computer" 
Execution Target Port = 0 
Execution Target Type = 0 

[SCC Options 0001] 
Use global settings = True 
SCC Provider = "" 
SCC Project = "" 
Local Path = "" 
Auxiliary Path = "" 
Perform Same Action For .h File As For .uir File = "Ask" 
Username = "" 
Comment = "" 
Use Default Username = False 
Use Default Comment = False 
Suppress CVI Error Messages = False 

[DLL Debugging Support 0001] 
External Process Path = "/c/Tcl/bin/wish.exe" 

[DLLs Used By Executable 0001] 
DLL 0001 = "/c/Tcl/bin/tcl84.dll" 

[Command Line Args 0001] 
Command Line Args = "" 

...它具有相同的行,但此項目更新到Tcl 8.6後正常工作。

UPDATE 5/13/2013 9:00 AM - 從目前所有的答案和評論中我可以看出,它肯定與LabWindows構建中的某些特質有關。所以,我希望能在今天工作結束的時候得到它的一個副本,我會用結果更新我的問題。

UPDATE 5/13/2013 2:13 PM - 好的,我得到了LabWindows,並首先嚐試刪除.cws文件中的行並重新編譯。 IDE只是在編譯之前重新生成該行,並以相同的結果結束。於是,我從頭開始創建一個新項目,並僅引入.c和.h文件。我手動設置了所有的包含和項目設置,當我獲得了成功的構建時,我查看了.cws文件,並且該行已經自動生成,產生了相同的結果。因此,在引用tcl84.dll的.c或.h文件中必須有一些函數調用或引用。任何額外的見解將非常感激。

回答

1

您正確使用與您的來電Tcl_InitStubs() Tcl的存根支持,但通過與Tcl84聯拋出窗外的好處。 DLL。

如果您使用存根,只需要鏈接您需要的最老的DLL的存根版本。在這種情況下,這個庫稱爲'tclstub84.lib'。這個靜態庫負責使Tcl 8.6能夠在不重新編譯的情況下加載8.4庫。

您可能還需要TCL_USE_STUBS編譯器定義,以使其正常工作。

查看http://tcl.activestate.com/doc/howto/stubs.html瞭解更多詳情如何正確啓用STUBS支持您的圖書館。

+0

您是否知道引用tcl84.dll的項目文件中具有相同行的擴展如何與8.6一起使用,而不會將tcl84.dll顯示爲依賴項? – Chrono 2013-05-10 19:11:46

+0

存根僅適用於Tcl解釋器存在並正在加載擴展的情況,而不是相反;它的設計使Tcl API根本不可調用,直到完成一個'Tcl_InitStubs(interp)'調用,並且需要一個_existing_' interp'句柄... – 2013-05-11 16:27:44

+0

@donal和schlenk,我用LabWindows的結果更新了我的問題可以將其排除爲罪魁禍首。你們能想到任何可能導致tcl84.dll被引用的.c代碼中的任何東西嗎?我會發布整個文件,但它是46k個字符。 – Chrono 2013-05-13 19:28:13

1

SI在深處。cws你有

[DLLs Used By Executable 0001] 
DLL 0001 = "/C/Tcl/bin/tcl84.dll" 

看起來好像它的依賴來自何處。

這很簡單。我不熟悉LabWindows和VisualStudio,所以我不知道你應該怎麼做來解決這個問題。

你要知道,改變上述行指定tcl86.dll看起來誘人:-)

+0

哦,哇,我不知道我怎麼沒有看到...但是,與其他LabWindows項目,與Tcl 8.6一起工作,沒有依賴關係也有它的項目文件中的行OK.cws 。所以不知怎的,這不能成爲問題的原因。 – Chrono 2013-05-10 17:06:26

+0

對不起,我無法再幫你了 - 正如我所說的我並不真正說LabWindows或Visual Studio。你的其他項目是否真的使用Tcl84?你的應用何時崩潰?當他們啓動時,或只有當你嘗試使用tcl8x.dll的東西?我不明白如何加載DLL的作品(我的無知沒有限制!),所以我只是想出了想法。 – nurdglaw 2013-05-10 18:08:16