我正在尝试使用SWIG为我的一些C++函数调用生成包装器。
此外,我正在尝试构建自己的the,因此我需要静态链接生成的SWIG库。我有我自己的Tcl_AppInit调用的主函数,在这里我做了一些先前的设置。
要做到这一点,我应该在程序的Tcl_AppInit调用中包含哪些功能?我发现SWIG_init不是正确的函数。我甚至尝试过使用Cell_Init,其中单元格是代码中类的名称,但这也没有帮助。
如何使用自己的主函数和Tcl_Appinit调用静态链接SWIG对象文件?
目前,当我使用以下命令链接可执行表时,会得到以下错误:
g++ -o bin/icde src/core/*.o src/read/*.o src/swig/*.o src/icde/*.o -ltk -ltcl我得到以下错误:
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文件:
~> 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文件和带有主函数的文件吗?
发布于 2012-04-03 09:03:27
通常,使用SWIG,您将得到一堆生成的源文件,您可以编译这些源文件。然后,您通常要做的事情是将它们打包到一个共享库中(与其他共享库具有适当的绑定依赖关系),该库可以使用load命令导入Tcl运行时。
但这次你不会想要那样的。相反,您需要用于创建共享库的对象文件,并且希望将它们包含在指令中,以便与保存main和Tcl_AppInit的对象文件一起构建一个可执行文件。您还需要确保在链接主可执行文件时使其依赖于这些外部共享库;可执行文件的构建要求满足所有依赖项,并将所有符号绑定到它们的定义中。(您可以使用静态库来简化此操作:它将一组对象文件组合到一个文件中。不过,仅仅使用它的对象文件没有什么区别;特别是,静态库并不绑定到它们的依赖项。)
最后,您确实希望在您的Cell_Init中包含对Tcl_AppInit的调用。这是正确的地方放置它(嗯,只要你没有安排包被加载到子解释器)。如果它以前失败了,那是因为你把连接搞错了。(提示:当链接线上的对象和库只依赖于链接行后面的内容时,链接器工作得最好。当你有一个复杂的构建时,正确的链接顺序是一种黑色的艺术!)
https://stackoverflow.com/questions/9987686
复制相似问题