- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
作为我不能做的事的一个简短例子:
#include <tcl.h>
#include <tclOO.h>
int main(void) {
Tcl_Interp *interp = Tcl_CreateInterp();
Tcl_Obj *obj = Tcl_NewStringObj("myObject", -1);
Tcl_Object object = Tcl_GetObjectFromObj(interp, obj);
return 0;
}
然后编译:
gcc main.c -o tclOOTest -ltcl
我当然会从链接器中得到错误,因为我没有链接到具有 Tcl_GetObjectFromObj 定义的库。问题是我不知道要链接到哪个库。我认为 tclOO 自 8.6 以来就内置于 tcl 中(这是我正在使用的)。
这里是错误:
/tmp/ccZnpdY8.o: In function `main':
main.c:(.text+0x33): undefined reference to `Tcl_GetObjectFromObj'
collect2: error: ld returned 1 exit status
最佳答案
TclOO API 与其他大部分 Tcl 不同,它仅通过 stub 表导出自身。在#include
Tcl 头文件之前,您应该#define
符号USE_TCL_STUBS
为1,并链接到tclstub
库。 (无论如何,这是构建扩展的推荐方式。)
[编辑]:如果你在你的程序中嵌入 Tcl,你需要一个 more complex procedure .基本上,您需要将程序划分为应用程序部分和内部 扩展部分。调用 Tcl_CreateInterp
的部分很可能是应用程序部分,访问 TclOO API 的部分是扩展(并且需要调用 Tcl_InitStubs
和 Tcl_OOInitStubs
在初始化函数中)。
扩展部分需要编译时定义USE_TCL_STUBS
。 (因为它很重要,您可以将其作为 #define
放在文件的顶部。维基页面也提到了 USE_TCLOO_STUBS
,但 暗示了这一点USE_TCL_STUBS
。)扩展部分需要在没有它的情况下构建。在开始运行任何(非内置)脚本之前,您可以在 Tcl_CreateInterp
调用之后立即调用安装内部扩展的初始化函数。然后,当您链接所有内容时,您将 both 链接到 libtclstub
和 libtcl
。
造成这种复杂性的原因是 TclOO 本身作为一个单独的扩展开始,并且从不支持外部 API 引用。我可能应该放宽对 Tcl 8.7 的限制……
关于c - 如何链接到 Tcl C API 中的 tclOO 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48361869/
我是一名优秀的程序员,十分优秀!