找不到符号 "Embeddedrcall_Init"

标签 c r g++ tcl swig

我正在尝试使用 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/

相关文章:

r - 防止 as.character 使用指数符号 r

r - ggplot2 - 每组的叠加平均值

c - 如何使用 C 在同一函数中获取不同类型的大小?

c - 使用 C 预处理器宏进行多级调试

r - 在ggplot2中叠加多边形并使叠加透明

c++ - g++ -E 选项输出

c++ - 虚拟方法上的 g++ [[noreturn]]

c++ - G++编译: undefined reference to `ATL_<…>' on Ubuntu 18.04

c - Odroid xu4、ocam 和 arduino uno 串行连接

c - nasm:当输入为 NULL 时跳转