C ++链接错误

时间:2014-02-21 13:38:34

标签: c++ linker

我有一个链接错误,我认为我不应该:

koala.o:
  In function `ns1::utils::io::protocol::InputSequenceFile
    <
      ns1::utils::io::protocol::TargetSequenceProtocol<
        ns1::utils::io::FooIndexTarget
      >
      , false
    >::InputSequenceFile(ns1::utils::io::DataFileDescriptor const&) [clone .constprop.1291]':
koala.cpp:(.text+0x332a):
  undefined reference to 
    `ns1::utils::io::DataFileFactory::createIndexedInputFile
    (
      ns1::utils::io::DataFileDescriptor const&, ns1::utils::io::IndexMode::Enum, bool
    )'

(我只更改了空格,因此可以更容易地阅读。我也非常谨慎地进行了一些无法实现。)

然后我使用nm来发现有关符号的案例:

nm other.o:
0000000000008f20 t _ZN4ns15utils2io15DataFileFactory22createIndexedInputFileERKNS1_18DataFileDescriptorENS1_9IndexMode4EnumEb.constprop.1677

nm koala.o:
                 U _ZN4ns15utils2io15DataFileFactory22createIndexedInputFileERKNS1_18DataFileDescriptorENS1_9IndexMode4EnumEb

(grepped outputs)

它们是不同的constprop.1677(我不知道它是什么)。有问题的方法是类的静态方法。我需要一些帮助才能理解问题的根本原因。

1 个答案:

答案 0 :(得分:3)

默认情况下,gcc的-O3开关打开-fipa-cp-clone,将-fno-ipa-cp-clone添加到命令行以禁用。

该开关在编译器中启用控制和到达流分析的相关优化,该编译器引入了可以显示为常量值的函数的折叠克隆版本,并且在编译对象中,可以通过{标识这些克隆来识别这些克隆。 {1}}后缀。


<强>背景

  

恒定传播是众所周知的全局流分析问题。该   持续传播的目标是发现恒定的值   在所有可能的程序执行和传播这些   尽可能通过该计划向前推进常数值。   其操作数都是常量的表达式可以在   编译时间和结果进一步传播。

     

Wegman,Mark N; Zadeck,F。Kenneth(1991年4月),“有条件分支的不断传播”,ACM编程语言和系统交易13(2):181-210

这是一个具体的例子:

.constprop

您可以观察到int foo (int x, int y) { if (y == 0) return 0; return foo (x, --y) % 2; } int main () { int z = 0; for (int i = 0; i < 6; i++) { z = z + foo (1, i); } } // g++-4.8 -c -O2 -fipa-cp-clone main.cpp && nm main.o 0000000000000030 T _Z3fooii 0000000000000000 t _Z3fooii.constprop.0 0000000000000000 T main 编译器识别出有一个常量被传递给外部可见的-fipa-cp-clone方法,并通过克隆该函数来准备优化。

See live here