gpt4 book ai didi

c++ - 没有 -On 就无法构建平凡的 Eigen3 张量程序

转载 作者:行者123 更新时间:2023-12-02 10:05:17 25 4
gpt4 key购买 nike

我正在尝试使用 eigen3 不支持的 Tensor 模块构建软件编写。我编写了一段简单的代码,它将使用 VectorXd 的简单应用程序构建(只需将其打印到标准输出),还将使用 Tensor 的类似应用程序代替 VectorXd 构建,但当我不构建时不会构建抛出一个优化标志 (-On)。请注意,我的构建来自使用 conda-forge 编译器的 conda 环境,因此下面的 g++ 是从 conda forge for ubuntu 获得的 g++。如果认为这是问题所在,它会在随后的错误消息中说明其名称。

我有一种感觉,这与我正在尝试编写的程序无关,而是以防万一我包含了一个似乎会产生错误的 mwe.cpp。代码如下:

#include <eigen3/Eigen/Dense>
#include <eigen3/unsupported/Eigen/CXX11/Tensor>
#include <iostream>

using namespace Eigen;
using namespace std;

int main(int argc, char const *argv[])
{
VectorXd v(6);
v << 1, 2, 3, 4, 5, 6;
cout << v.cwiseSqrt() << "\n";
Tensor<double, 1> t(6);
for (auto i=0; i<v.size(); i++){
t(i) = v(i);
}
cout << "\n";
for (auto i=0; i<t.size(); i++){
cout << t(i) << " ";
}
cout << "\n";
return 0;
}


如果上面的代码在没有任何优化的情况下编译,比如:
g++ -I ~/miniconda3/envs/myenv/include/ mwe.cpp -o mwe

我收到以下编译器错误:
/home/myname/miniconda3/envs/myenv/bin/../lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/../../../../x86_64-conda_cos6-linux-gnu/bin/ld: /tmp/cc2q8gj4.o: in function `Eigen::internal::(anonymous namespace)::get_random_seed()':
mwe.cpp:(.text+0x15): undefined reference to `clock_gettime'
collect2: error: ld returned 1 exit status

相反,如果我要求'n'优化级别,如下所示:
g++ -I ~/miniconda3/envs/loos/include/ -On mwe.cpp -o mwe

该程序毫无怨言地构建,我得到了预期的输出:
$ ./mwe 
1
1.41421
1.73205
2
2.23607
2.44949

1 2 3 4 5 6

我不知道为什么这个小程序或我正在尝试编写的真正程序会尝试为任何东西获取随机种子。任何意见,将不胜感激。我想在没有优化的情况下构建的原因是调试更容易。我实际上认为这一切都是由调试标志引起的,但我意识到我的构建工具的调试设置并没有要求优化,并将其缩小到明显的原因。如果我抛出 -g -O1我没有看到错误。

显然,如果要注释掉与 Tensor 模块有关的所有代码,即 main 中“return”上方和 cwiseSqrt() 行下方的所有内容,以及 include 语句,代码将构建并产生预期的输出.

最佳答案

从技术上讲,这是一个链接器错误(g++ 调用编译器以及链接器,具体取决于命令行参数)。如果从某个地方调用外部定义的函数,即使从未到达过代码,也会出现链接器错误。

在启用优化的情况下编译时,g++ 将优化掉未调用的函数(在全局命名空间之外),因此不会出现链接器错误。你可以试试-Og而不是 -O1以获得更好的调试体验。

以下代码应产生类似的行为:

int foo(); // externally defined

namespace { // anonymous namespace
// defined inside this module, but never called
int bar() {
return foo();
}
}

int main() {
// if you un-comment this line, the
// optimized version will fail as well:
// ::bar();
}

根据 man clock_gettime您需要链接 -lrt如果您的 glibc 版本早于 2.17 - 也许您的设置就是这种情况:
g++ -I ~/miniconda3/envs/myenv/include/ mwe.cpp -o mwe -lrt

关于c++ - 没有 -On 就无法构建平凡的 Eigen3 张量程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60501146/

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