我正在尝试使用 swig 在 Windows 环境中为嵌入式 R C 程序创建 dll 文件。我正在使用以下命令:
C:\swigwin-3.0.12\Examples\r\Z>swig -c++ -tcl embeddedRCall.i
C:\swigwin-3.0.12\Examples\r\Z>gcc -c embeddedRCall.c -I/swigwin-3.0.12/Examples/r/Z
C:\swigwin-3.0.12\Examples\r\Z>gcc -c embeddedRCall_wrap.c -I/Tcl/include/tcl8.6 -I/swigwin-3.0.12/Examples/r/Z
C:\swigwin-3.0.12\Examples\r\Z>gcc -shared embeddedRCall.o embeddedRCall_wrap.o -o embeddedRCall.dll -L/Tcl/lib -L/R/R-3.3.2/bin/i386 -lR -lRblas -lRiconv -lRlapack -ltcl86
% load embeddedRCall
cannot find symbol "Embeddedrcall_Init"
我能够使用 tclsh 加载其他 example.dll 文件
然而我无法找出原因——我已经在使用 tcl 32 位
我的模块文件名是,模块名称是embeddedRcall
我是不是漏掉了什么???
我对 TCL 比较陌生,有人可以帮助我吗?
最佳答案
您的库中应该有一个导出的 (extern "C"
) 函数符号,名称类似于 Embeddedrcall_Init
;它是让 Tcl 将库安装到特定解释器实例中的入口点。 (必须显式地找到它,因为它需要一个参数。)默认情况下,函数的名称是通过修改库的名称来找到的(剥离版本号、大小写转换、附加_Init
),但是名称的确定可以由可选 second argument to load
覆盖。 .
更准确地说,如果该条目实际上被称为 EmbeddedRCall_Init
,则必须使用以下命令加载它:
load embeddedRCall EmbeddedRCall
# The _Init suffix is fixed when loading into a standard interp
注意大小写区别! (此外,我们建议使用完全限定的路径名来加载库,因为它可以避免 dlopen()
系统中的一些复杂性。)
关于找不到符号 "Embeddedrcall_Init",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43441934/