SWIG未定义的符号

SWIG undefined symbols

本文关键字:符号 未定义 SWIG      更新时间:2023-10-16

我正在使用SWIG在Ruby中包装c++代码。

我在特定位置的八个独立文件中定义了八个类。我有两种方法在Ruby中包装它们。

在第一种方法中,我将所有类放在一个文件中,将该文件放在与SWIG接口文件相同的目录中,一切正常。

然而,我被要求链接到文件的原始位置,并将我的接口文件放在不同的目录中。当我编译时,我编译它们目录中的所有文件以及包装器代码,并且没有产生任何错误。然而,我得到了未定义的符号。

我编译shell脚本的一部分是:

g++ -std=c++11 -fPIC -c ../../dir1/dir2/Class.cpp
g++ -std=c++11 -fPIC -c mymodule_wrap.cxx -I/usr/include/ruby-1.9.1 -I/usr/include/ruby-1.9.1/x86_64-linux

我以与"File.cpp"相同的方式编译所有其他七个文件。没有编译错误。

然后,当我尝试下面的

require 'mymodule'
c = Mymodule::Class.new

我为Class的构造函数获得了一个未定义的符号(我使用c++filt解析了未定义的符号),它是声明和定义的。

我编译的方式有问题吗?或者当涉及到头/源文件和SWIG接口文件的不同位置时,是否存在一些问题?因为这与我将所有类放在一个文件中没有任何不同,除了位置。

编辑:如果我在头文件中移动声明函数的定义,我就不会得到未定义的符号。这意味着它实际上甚至没有达到cpp文件中的定义。但是为什么呢?当我所有的类都没有分开时,我仍然将定义保存在cpp文件中,并将声明保存在头文件中…

创建共享库时,它不知道源代码的目标文件在哪里,因此它永远不知道头文件中声明的任何定义。

对我来说,所有的目标文件都是在我编译所有东西的接口文件的同一个文件夹中创建的,我添加了这个:

g++ -shared Class.o mymodule_wrap.o -o mymodule.so

到我的编译shell脚本。在我使用extconf makefile创建脚本之前,我不确定它在哪里搜索对象文件。