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
(grepped输出)
不算constprop.1677
(我不知道它是什么),它们是一样的。有问题的方法是一个类的静态方法。我需要一些帮助来了解问题的根本原因。
gcc的-O3
开关默认打开-fipa-cp-clone
,将-fno-ipa-cp-clone
添加到命令行以禁用。
该开关实现了编译器中控制和到达流分析的相关优化,该编译器引入了可以显示为常数值的函数的折叠克隆版本,并且在编译的对象中,这些克隆可以通过.constprop
后缀来识别。
背景
恒定传播是一个众所周知的全局流量分析问题。这个常量传播的目标是发现常量值关于程序的所有可能执行,并传播这些通过程序尽可能向前传递常量值。操作数都是常量的表达式可以在编译时,结果会进一步传播
韦格曼,Mark 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()
方法,并通过克隆函数为优化做准备。
(请参阅此处直播)
相关文章:
- Netbeans 10:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
- CMake 错误:链接器命令失败,退出代码为 1 和 cpp.o 文件
- clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用) - 体系结构的未定义符号 x86_64:
- 如何修复 clang: 错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
- Android NDK.Build命令失败.未定义的引用.clang++:错误:链接器命令失败,退出代码为1
- 使用cmake错误链接boost日志
- 错误:链接器命令失败,退出代码为 1(使用 -v 查看调用):在 Macbook 上
- C++ XCODE ld:找不到体系结构x86_64 clang 的符号:错误:链接器命令失败,退出代码为 1(使用 -
- clang:错误:链接器命令失败,C++代码中的退出代码为 1(使用 -v 查看调用)
- 静态库中的 g++ 错误链接函数
- 未定义的参考错误链接天然函数Android
- C++编译错误:ld:找不到体系结构x86_64 clang 的符号:错误:链接器命令失败,退出代码为 1(使用 -v
- QT Q_PROPERTY错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
- ld:找不到体系结构x86_64 clang 的符号:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
- OSX MOJAVE -LD:架构X86_64 clang找不到符号:错误:链接器命令失败,出口代码1
- C 错误链接器命令失败了出口代码1(使用-V查看调用)
- LD:架构x86_64 clang找不到符号:错误:链接器命令失败,出口代码1(使用-v to See
- 聚输出错误 - 链接列表
- Xcode链接器错误:链接器命令失败,退出代码为1(使用-v查看调用)
- 尝试构建C DLIB示例无法与数百个未定义的参考错误链接