【问题标题】:SWIG undefined symbolsSWIG 未定义的符号
【发布时间】: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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 这是一个答案吗?还是另一个问题?还是澄清一下?
    • @Mark 这是一个答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-17
    • 1970-01-01
    • 1970-01-01
    • 2021-05-20
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    相关资源
    最近更新 更多