SWIG 未定义符号

SWIG undefined symbols

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

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

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

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

我的编译 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 删除了未定义的符号),它已被声明和定义。

是不是我编译的方式有问题?还是 header/source 文件和 SWIG 接口文件的不同位置存在一些问题?因为这与我在一个文件中包含所有 类 没有任何不同,除了位置。

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

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

对我来说,所有目标文件都创建在与我编译所有内容的接口文件相同的文件夹中,我添加了这个:

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

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