繁体   English   中英

C ++链接错误

[英]A C++ linking error

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

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

(产量增加)

它们是相同的,但不包括constprop.1677 (我不知道它是什么)。 所讨论的方法是类的静态方法。 我需要一些帮助来了解问题的根本原因。

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

该开关可在编译器中实现控制和到达流分析中的相关优化,从而引入功能的折叠克隆版本,这些版本可以显示为恒定值,而在编译对象中,这些克隆可以通过.constprop后缀标识。


背景

恒定传播是一个众所周知的全局流分析问题。 恒定传播的目的是发现在程序的所有可能执行中恒定的值,并在程序中尽可能远地传播这些恒定值。 可以在编译时评估其操作数均为常量的表达式,并将结果进一步传播。

韦格曼,马克·N; Zadeck,F。Kenneth(1991年4月),“有条件分支的恒定传播”,关于编程语言和系统的ACM事务13(2):181–210

这是一个具体的例子:

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编译器识别出有一个常量传递给外部可见的foo()方法,并通过克隆函数为优化做准备。

请看这里直播

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM