我正在尝试使用SWIG为我的一些C ++函数调用生成包装器。
另外,我正在尝试构建自己的TCL shell,因此我需要静态链接生成的SWIG库。我有一个Tcl_AppInit
调用我自己的主函数,我先做了一些设置。
要执行此操作,我应该在程序的Tcl_AppInit
来电中包含哪些功能?我发现SWIG_init
不是正确的功能。我甚至试过Cell_Init
,其中cell是我的代码中类的名称,但这也无济于事。
如何使用我自己的主函数和Tcl_Appinit
调用静态链接SWIG对象文件?
目前,当我使用以下命令链接我的executabel时,我收到以下错误:
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
我检查了src / swig / cell.o文件,该文件具有Cell_Init函数或不使用objdump:
~> objdump -d src/swig/cell.o | grep Cell_Init
00006461 <Cell_Init>:
646c: 75 0a jne 6478 <Cell_Init+0x17>
我不确定在链接时我是否做错了。
-------------------更新--------------------------- -
我发现将swig / swig.cxx文件直接包含在调用Tcl_AppInit函数的主文件中可以解决链接问题。是否有一个原因。
是不是可以使用main函数创建和分别链接swig文件和文件?
答案 0 :(得分:0)
通常,使用SWIG,您最终会得到一堆您编译的生成源文件。您通常会将它们打包到一个共享库(对其他共享库具有适当的绑定依赖性),可以使用load
命令将其导入到Tcl运行时。
但是你这次不想要。相反,您需要用于创建共享库的目标文件,并且希望将它们包含在说明中以构建可执行文件以及包含main
和Tcl_AppInit
的目标文件。您还需要确保在链接您使用 it 的主可执行文件时依赖于这些外部共享库;可执行构建要求您满足所有依赖项并使所有符号绑定到它们的定义。 (您可以使用静态库来简化这一过程:它将一堆目标文件合并到一个文件中。虽然使用它的目标文件没有什么区别;特别是,静态库没有绑定到它们的依赖项。 )
最后,您做想要在Cell_Init
中加入Tcl_AppInit
的来电。这是放置它的正确位置(好吧,只要你没有安排将包加载到子解释器中)。如果它之前失败了,那是因为你的链接错了。 (提示:当链接行上的对象和库仅依赖于链接行上的以后时,链接器工作得最好。当你有一个复杂的链接时,获得正确的链接顺序是一种黑色艺术建立!)