2016-08-23 153 views
0

我使用SWIG将C++代码封装在Ruby中。SWIG未定义符号

我有八个类定义在八个单独的文件在一个特定的位置。我有两种方法将它们包装在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 

我得到的类的构造函数未定义的符号(I demangled用C++ FILT未定义的符号),它被声明和定义以下。

我编译的方式有问题吗?或者在头文件/源文件和SWIG接口文件的不同位置存在一些问题?因为这与我在一个文件中除了位置以外的所有类没有任何区别。

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

回答

0

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

对我来说,所有的目标文件都在同一文件夹中,我编写的一切接口文件创建的,我加了这一点:

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

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

+0

这是一个答案?还是另一个问题?或澄清? –

+0

@Mark这是一个答案。 – satj