Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
正在写入Tcl C扩展共享库[链接错误]_C_Visual C++_Tcl - Fatal编程技术网

正在写入Tcl C扩展共享库[链接错误]

正在写入Tcl C扩展共享库[链接错误],c,visual-c++,tcl,C,Visual C++,Tcl,我按照指南用C编写一个简单的Tcl扩展。我已经按照他在文章中介绍的方式编写了源代码,我正在使用MSVC的命令行编译器(cl.exe)进行编译。我的目标是将此源代码转换为共享库(DLL),并允许我的Tcl脚本访问此共享库以使用我实现的Tcl扩展 我已将Tcl安装在以下目录中: C:\Tcl 以下是源代码: tcl示例.h #include <tcl.h> /* <package_name>_Init is called when a package is loaded.

我按照指南用C编写一个简单的Tcl扩展。我已经按照他在文章中介绍的方式编写了源代码,我正在使用MSVC的命令行编译器(cl.exe)进行编译。我的目标是将此源代码转换为共享库(DLL),并允许我的Tcl脚本访问此共享库以使用我实现的Tcl扩展

我已将Tcl安装在以下目录中:

C:\Tcl
以下是源代码:

tcl示例.h

#include <tcl.h>

/* <package_name>_Init is called when a package is loaded. In this case,
   since our package is named "Random", we call the function Random_Init()
*/
#ifdef __cplusplus
extern "C" {
#endif

__declspec(dllexport) int Random_Init(Tcl_Interp* interp);
//EXTERN int Random_Init(Tcl_Interp* interp);

__declspec(dllexport) int RandomCmd(ClientData cd, Tcl_Interp* interp, int argc, char* CONST argv[]);
//EXTERN int RandomCmd(ClientData cd, Tcl_Interp* interp, int argc, char* CONST argv[]);

__declspec(dllexport) int RandomObjCmd(ClientData cd, Tcl_Interp* interp, int objc, Tcl_Obj *CONST objv[]);
//EXTERN int RandomObjCmd(ClientData cd, Tcl_Interp* interp, int objc, Tcl_Obj* CONST objv[]);

#ifdef __cplusplus
}
#endif
正如您所看到的,我已经包括了到驻留在
C:\Tcl\include\tcl8.5
中的Tcl头的
include
路径,以及位于
C:\Tcl\lib
中的存根库

我在运行上述命令时出现以下错误:

/out:TclExample.exe
/DLL
/LIBPATH
C:\Tcl\lib\tclstub85.lib
/LIBPATH
C:\Tcl\lib\tkstub85.lib
/LIBPATH
C:\Tcl\lib\ttkstub.lib
/OUT:TclExample.dll
TclExample.obj
   Creating library TclExample.lib and object TclExample.exp
TclExample.obj : error LNK2019: unresolved external symbol _Tcl_InitStubs referenced in function _Random_Init
TclExample.obj : error LNK2019: unresolved external symbol _tclStubsPtr referenced in function _Random_Init
TclExample.dll : fatal error LNK1120: 2 unresolved externals
我试着在网上做一些挖掘,但我在这一点上卡住了。我查看了
Tcl.h
头,确实看到了在那里声明的Tcl_InitStubs函数。另外,我也不确定tclStubsPtr错误来自何处,因为我在源代码中没有使用同名函数。有人知道这是什么问题吗


另外,我现在只能使用命令行,所以我需要一个命令行解决方案(如果可能的话)。我还从ActiveTcl发行版获得了我的Tcl文件。

我最初看到了相同的链接错误。通过将我的配置从Win32更改为x64,就解决了这个问题

我一开始看到了相同的链接错误。通过将我的配置从Win32更改为x64,就解决了这个问题

LIBPATH用于指定库所在的目录,而不是指定要链接的库。@Jackson,在将命令行修复为
/LIBPATH:C:\Tcl\lib tclstub85.lib之后,我仍然看到相同的问题。LIBPATH的可能副本用于指定库所在的目录,而不是指定要链接的库。@Jackson,在将命令行修复为
/LIBPATH:C:\Tcl\lib tclstub85.lib后,我仍然看到相同的问题。可能是重复的
cl /I C:\Tcl\include\tcl8.5 /DUSE_TCL_STUBS /DBUILD_tcl /Ox TclExample.c
 /link /DLL /LIBPATH C:\Tcl\lib\tclstub85.lib /LIBPATH C:\Tcl\lib\tkstub85.lib
 /LIBPATH C:\Tcl\lib\ttkstub.lib /OUT:TclExample.dll
/out:TclExample.exe
/DLL
/LIBPATH
C:\Tcl\lib\tclstub85.lib
/LIBPATH
C:\Tcl\lib\tkstub85.lib
/LIBPATH
C:\Tcl\lib\ttkstub.lib
/OUT:TclExample.dll
TclExample.obj
   Creating library TclExample.lib and object TclExample.exp
TclExample.obj : error LNK2019: unresolved external symbol _Tcl_InitStubs referenced in function _Random_Init
TclExample.obj : error LNK2019: unresolved external symbol _tclStubsPtr referenced in function _Random_Init
TclExample.dll : fatal error LNK1120: 2 unresolved externals