首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SWIG静态链接

SWIG静态链接
EN

Stack Overflow用户
提问于 2012-04-03 05:42:22
回答 1查看 695关注 0票数 1

我正在尝试使用SWIG为我的一些C++函数调用生成包装器。

此外,我正在尝试构建自己的the,因此我需要静态链接生成的SWIG库。我有我自己的Tcl_AppInit调用的主函数,在这里我做了一些先前的设置。

要做到这一点,我应该在程序的Tcl_AppInit调用中包含哪些功能?我发现SWIG_init不是正确的函数。我甚至尝试过使用Cell_Init,其中单元格是代码中类的名称,但这也没有帮助。

如何使用自己的主函数和Tcl_Appinit调用静态链接SWIG对象文件?

目前,当我使用以下命令链接可执行表时,会得到以下错误:

代码语言:javascript
复制
g++ -o bin/icde src/core/*.o src/read/*.o src/swig/*.o src/icde/*.o -ltk -ltcl

我得到以下错误:

代码语言:javascript
复制
src/icde/main.o: In function `AppInit(Tcl_Interp*)':
main.cpp:(.text+0xa9): undefined reference to `Cell_Init(Tcl_Interp*)'
collect2: ld returned 1 exit status

我检查了具有Cell_Init函数或不使用objdump的src/swig/cell.o文件:

代码语言:javascript
复制
~> objdump -d src/swig/cell.o | grep Cell_Init
00006461 <Cell_Init>:
    646c:       75 0a                   jne    6478 <Cell_Init+0x17>

我不确定我是否做错了什么,而连接。

我发现在主文件中直接包含swig/swg.cxx文件,它调用了Tcl_AppInit函数,解决了链接问题。这有什么原因吗。

难道不可能创建并单独链接swig文件和带有主函数的文件吗?

EN

回答 1

Stack Overflow用户

发布于 2012-04-03 09:03:27

通常,使用SWIG,您将得到一堆生成的源文件,您可以编译这些源文件。然后,您通常要做的事情是将它们打包到一个共享库中(与其他共享库具有适当的绑定依赖关系),该库可以使用load命令导入Tcl运行时。

但这次你不会想要那样的。相反,您需要用于创建共享库的对象文件,并且希望将它们包含在指令中,以便与保存mainTcl_AppInit的对象文件一起构建一个可执行文件。您还需要确保在链接主可执行文件时使其依赖于这些外部共享库;可执行文件的构建要求满足所有依赖项,并将所有符号绑定到它们的定义中。(您可以使用静态库来简化此操作:它将一组对象文件组合到一个文件中。不过,仅仅使用它的对象文件没有什么区别;特别是,静态库并不绑定到它们的依赖项。)

最后,您确实希望在您的Cell_Init中包含对Tcl_AppInit的调用。这是正确的地方放置它(嗯,只要你没有安排包被加载到子解释器)。如果它以前失败了,那是因为你把连接搞错了。(提示:当链接线上的对象和库只依赖于链接行后面的内容时,链接器工作得最好。当你有一个复杂的构建时,正确的链接顺序是一种黑色的艺术!)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9987686

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档