错误信息:
E:\src\c\tcl\main.oIn function `Tcl_AppInit':
8E:\src\c\tcl\main.cundefined reference to `_imp__Tcl_Init'
E:\src\c\tcl\main.oIn function `main':
14E:\src\c\tcl\main.cundefined reference to `_imp__Tcl_Main'
E:\src\c\tcl\collect2.exe[Error] ld returned 1 exit status
26E:\src\c\tcl\Makefile.winrecipe for target 'tcl_test.exe' failed
c源代码:
#include <stdio.h>
#include <stdlib.h>
#include <tcl.h>
#include <tk.h>
int Tcl_AppInit(Tcl_Interp *interp)
{
return (Tcl_Init(interp) == (TCL_ERROR))?TCL_ERROR:TCL_OK;
}
int main(int argc, char** argv)
{
printf("--- Tcl Third-Party Shell Start ---\n");
Tcl_Main(argc, argv, Tcl_AppInit);
printf("--- Tcl Third-Party Shell End ---\n");
return 0;
}
答案 0 :(得分:0)
为了访问这些功能(特别是Tcl_Main
),必须将您的代码与Tcl DLL(我认为在您的安装中为tcl85.dll
)链接起来;它不是通过Tcl的存根链接机制导出的符号。我不确切知道你是如何在Windows上做的(也不知道它将在何处定位)但指示你的构建环境使用DLL应该不会太困难。
FWIW,Tcl_Init
始终返回TCL_OK
(即0)或TCL_ERROR
(即1)。如果您在基本初始化后不打算安装自己的命令和功能,则可以直接从AppInit函数返回值。
答案 1 :(得分:0)
在玩了一下后,我可以在Visual Studio中重现并解决这个问题。
您只需将D:\Tcl\lib\tcl86.lib
添加到“链接器/输入”下的“附加依赖项”中。
这解决了我的问题。
您可以将Tcl_Init
传递给Tcl_Main
(如果您不需要进行任何特定的初始化),或者只返回Tcl_Init
的结果:
int Tcl_AppInit(Tcl_Interp *interp)
{
return Tcl_Init(interp);
}