【发布时间】:2016-08-23 16:40:14
【问题描述】:
我正在使用 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
我为类的构造函数得到了一个未定义的符号(我使用 c++filt 对未定义的符号进行了分解),它被声明并定义了。
我的编译方式有问题吗?或者当涉及到头文件/源文件和 SWIG 接口文件的不同位置时是否存在一些问题?因为这与我将所有类放在一个文件中时没有任何不同,除了位置。
编辑: 如果我在头文件中移动声明函数的定义,我不会得到未定义的符号。这意味着它实际上甚至没有达到 cpp 文件中的定义。但为什么?当我将所有类分开时,我仍然将定义保存在 cpp 文件中,并将声明保存在头文件中......
【问题讨论】:
标签: c++ ruby swig undefined-symbol