【问题标题】:Linker problem, doesn't find an existing method?链接器问题,找不到现有方法?
【发布时间】:2009-03-12 18:42:02
【问题描述】:

好的,我当前项目的链接器有问题(这是另一个问题的延续,ish)

基本上,链接器在 dynamiclib.so 中给出了一个未定义的引用:

std::basic_ostream<char, std::char_traits<char> >& SparseImplementationLib::operator<< <double, double, SparseImplementationLib::DefaultPtr<double, double> >(std::basic_ostream<char, std::char_traits<char> >&, SparseImplementationLib::AbstractSparseNode<double, double, SparseImplementationLib::DefaultPtr<double, double> > const&)

而我只能找到:

std::ostream&amp; SparseImplementationLib::operator&lt;&lt; &lt;double, double, SparseImplementationLib::DefaultPtr&lt;double, double&gt; &gt;(std::ostream&amp;, SparseImplementationLib::AbstractSparseNode&lt;double, double, SparseImplementationLib::DefaultPtr&lt;double, double&gt; &gt; const&amp;)
文件内。

事实上,它们是相同的方法(basic_ostream 和 ostream 可以互换?)

如果我手动将第一个方法添加到命名空间,它会抱怨它在编译时已经定义。

有人知道这里到底发生了什么吗?

干杯,埃德

注意,这是 MPICXX 和 CCMAKE

【问题讨论】:

    标签: c++ linker


    【解决方案1】:

    听起来您没有将 dynamiclib.so 正确链接到 SparseImplementationLib。您的 makefile 中是否有类似于 -lSparseImplementationLib 的链接器标志?

    【讨论】:

    • SparseImplementationLib 是另一个从代码文件编译的库,它位于另一个目录中,名为 libmiindsparseimplementation.so,而且它的链接很好。因为这是 CCMAKE,我真的不能乱弄 make 文件,如果你这样做,它会变得疯狂。
    【解决方案2】:

    我正在使用的类似 gStreamer 的引擎(几乎)遇到了同样的问题 - 从 .so 文件调用的函数在主代码中不存在。

    我发现链接器正在删除该函数,因为它没有被任何内部函数调用。

    目前,我已经通过函数调用/构造函数强制链接器将函数包含在有条件地从不调用的函数中,从而解决了这个问题:-

    bool callme = false;
    
    if(callme == true)
    {
        dummyfunction();
    }
    

    我发现这迫使链接器包含,但代码本身从未运行。

    如果有人有阻止链接器如此智能的解决方案,或者有一个“正确”的方法可以使用,我想听听!

    【讨论】:

      【解决方案3】:

      好的,经过昨晚大约 10 个小时的黑客攻击,我今天早上设法解决了这个问题。

      事实证明,如果您将函数的定义内联,并确保它具有所有模板参数和非默认参数的函数选项,它就会编译!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-04-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多