gpt4 book ai didi

c++ - 模板化链接不适用于 -O2,但适用于 -O0

转载 作者:太空狗 更新时间:2023-10-29 21:40:39 25 4
gpt4 key购买 nike

我编写了一个使用 cmake 绑定(bind)的 C++ 程序并在 Debian 机器上运行。我很高兴地说所有已知的主要错误都是已更正,我准备好从

add_definitions(-Wall)
set(CMAKE_BUILD_TYPE Debug)
add_definitions("-O0 -std=c++0x")

一直到

add_definitions("-O2 -std=c++0x")

我就是这样做的,突然间我的项目中出现了一个模板化类(天真地在一些头文件中声明并为所有用例定义在一些单独的 .cpp 中)因大量“未定义”错误而中断联动期间。

在这个论坛上的一些研究产生了这样的主题: Why can templates only be implemented in the header file?我相信我看到 Luc 在他著名的回答中正在插入什么在:编译器实际上为每个需要的模板类版本“编写代码”(即 T=int、T=float、T=what_ever_else)为此需要访问实际实现。

很公平。但是这里完全让我感到困惑的是:这显然只有在尝试优化编译时才是一个问题。使用“-O0”一切正常。怎么可能?

附录

1.) 关于重复嫌疑人:这里的问题不是我做了什么那是错的。我的罪过很明显:我定义了遥不可及的模板函数由于所述原因显然不允许的头文件在我已经引用的帖子的上方和内部。

鉴于上述引用帖子的真实性,很明显我的程序无法编译。我不明白的是:为什么 它用 -O0 编译。

2.) nos 要求一些明确的错误。我最后一次尝试使用 -O2 的结尾仍在我的终端缓冲区中(抱歉,编译大约需要一个小时,因此不容易重现)。但实际上它在链接期间中断了。这是我仍然可以将鼠标指针放在上面的内容:

/home/kochmn/projects/free_sentinel_gl/sentinel/src/game/game.cpp:432: undefined reference to `game::Board<game::Figure>::get(QPoint)'
libqt.a(game.cpp.o): In function `game::Game::hyperspace_jump()':
/home/kochmn/projects/free_sentinel_gl/sentinel/src/game/game.cpp:950: undefined reference to `game::Board<game::Square>::get(QPoint)'

[... many more like that all concerned about the templated class "Board"
which is declared in landscape.h, defined in landscape.cpp and
used pretty much everywhere else ... ]

collect2: error: ld returned 1 exit status
CMakeFiles/sentinel.dir/build.make:548: recipe for target 'sentinel' failed
make[2]: *** [sentinel] Error 1
CMakeFiles/Makefile2:127: recipe for target 'CMakeFiles/sentinel.dir/all' failed
make[1]: *** [CMakeFiles/sentinel.dir/all] Error 2
Makefile:76: recipe for target 'all' failed
make: *** [all] Error 2

3.) 关于评论问题“如何定义用例?”:让我们利用这个在 GitHub 上的事实。

所有用例都在这里定义:https://github.com/kochsoft/free_sentinel_gl/blob/master/sentinel/src/game/landscape.cpp#L507从第 507 行开始。

header 在这里:https://github.com/kochsoft/free_sentinel_gl/blob/master/sentinel/src/include/landscape.h#L363从第 363 行开始的相关段落。

最佳答案

我的问题已解决,dyp 与他/她的评论最接近。神奇的词是“显式模板实例化”,可以在这里找到:http://www.cplusplus.com/forum/articles/14272/

我没有用定义来混淆我的头文件。我也没有在 header 中添加像 #include "some.cpp" 这样的代码,在我看来这等同于相同的代码。相反,我添加了行

template class Board<Figure>; 
template class Board<Square>;

就在 landscape.cpp 中的定义下,并且能够使用 -O2 进行编译。

根据 Why can templates only be implemented in the header file?不过,我只能在我的板上使用数字和正方形(这很适合我)。

至于为什么 -O0 起作用:正如上面评论中的 dyp 所述,优化编译器可能删除了一些在 -O0 下用于模板实例化的代码片段。可能......我仍然不声称已经完全理解了这一切。

@dyp:你为什么不发布一个全面的答案来证明你之前的评论?

关于c++ - 模板化链接不适用于 -O2,但适用于 -O0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30596815/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com