Code Bye

g++ c++11 cmath 不能开平方???

我在ubuntu 64 位下, g++ 版本为  4.9 用 g++ -std=c++11 编译,使用cmath头文件,调试运行到sqrt时出错。下面是部分源码和调试信息:
源码:
   trans(vc0, p4);

void trans(const vector<double> &v, vector<double> &p)
{
  double vv=sqrt(v[1]*v[1]+v[2]*v[2]+v[3]*v[3]);
  double ga=1.0/sqrt(1.0-vv*vv);
  double ppar=p[1]*v[1]+p[2]*v[2]+p[3]*v[3];
  double gavv=(ppar*ga/(1.0+ga)-p[0])*ga;
  p[0]=ga*(p[0]-ppar);
  p[1]=p[1]+v[1]*gavv;
  p[2]=p[2]+v[2]*gavv;
  p[3]=p[3]+v[3]*gavv;
}

调试:
571                     trans(vc0, p4);
(gdb) s
trans (v=std::vector of length 4, capacity 4 = {…}, p=std::vector of length 4, capacity 4 = {…}) at LBT2.cc:2075
2075   double vv=sqrt(v[1]*v[1]+v[2]*v[2]+v[3]*v[3]);
(gdb) s
std::vector<double, std::allocator<double> >::operator[] (this=0x62a310 <vc0>, __n=1) at /usr/include/c++/4.9/bits/stl_vector.h:795
795       { return *(this->_M_impl._M_start + __n); }
(gdb) s
std::vector<double, std::allocator<double> >::operator[] (this=0x62a310 <vc0>, __n=1) at /usr/include/c++/4.9/bits/stl_vector.h:795
795       { return *(this->_M_impl._M_start + __n); }
(gdb) s
std::vector<double, std::allocator<double> >::operator[] (this=0x62a310 <vc0>, __n=2) at /usr/include/c++/4.9/bits/stl_vector.h:795
795       { return *(this->_M_impl._M_start + __n); }
(gdb) s
std::vector<double, std::allocator<double> >::operator[] (this=0x62a310 <vc0>, __n=2) at /usr/include/c++/4.9/bits/stl_vector.h:795
795       { return *(this->_M_impl._M_start + __n); }
(gdb) s
std::vector<double, std::allocator<double> >::operator[] (this=0x62a310 <vc0>, __n=3) at /usr/include/c++/4.9/bits/stl_vector.h:795
795       { return *(this->_M_impl._M_start + __n); }
(gdb) s
std::vector<double, std::allocator<double> >::operator[] (this=0x62a310 <vc0>, __n=3) at /usr/include/c++/4.9/bits/stl_vector.h:795
795       { return *(this->_M_impl._M_start + __n); }
(gdb) s
__sqrt (x=0) at w_sqrt.c:27
27 w_sqrt.c: No such file or directory.
(gdb) p p
No symbol “p” in current context.
(gdb) s
30 in w_sqrt.c
(gdb) s
__ieee754_sqrt (d=0) at ../sysdeps/x86_64/fpu/math_private.h:58
58 ../sysdeps/x86_64/fpu/math_private.h: No such file or directory.

补充一下,我已经申明过命名空间
using namespace std;
using std::vector;
哦,我搞错了一点,开方和乘方的赋值语句并没有出错,对象确实被开方或者乘方了。
可是为何在用gdb 调试的时候,在开方的时候它会输出 找不到某个文件呢,,,我以为是出错了呢
15分
gdb 想把当前执行位置的源代码给你打印出来,所以它需要打开包含 sqrt 这个函数的源代码文件,在查找这个文件的时候没找到就给了一个提示。
引用 3 楼 adlay 的回复:

gdb 想把当前执行位置的源代码给你打印出来,所以它需要打开包含 sqrt 这个函数的源代码文件,在查找这个文件的时候没找到就给了一个提示。

可是 sqrt 这个函数在 /usr/include/4.9/c++/cmath 里面定义的把,它怎么不去这里找,找到别的地方了。。。

/usr/include/4.9/c++/cmath  是头文件,它要找实现的文件
引用 5 楼 adlay 的回复:

/usr/include/4.9/c++/cmath  是头文件,它要找实现的文件

那它没找到,可是程序确实执行了这个函数,是不是表明gdb 默认情况下对 c++11的支持并不够全面呢?

5分
在没有对应源代码或符号信息的情况下,不要分心费力去找对应源代码或符号信息,要集中注意力在期望执行的汇编指令对应逻辑是否正确上。
引用 6 楼 wseektime 的回复:
Quote: 引用 5 楼 adlay 的回复:

/usr/include/4.9/c++/cmath  是头文件,它要找实现的文件

那它没找到,可是程序确实执行了这个函数,是不是表明gdb 默认情况下对 c++11的支持并不够全面呢?

程序执行的是编译后的机器码,它要找的是源代码

引用 8 楼 adlay 的回复:
Quote: 引用 6 楼 wseektime 的回复:
Quote: 引用 5 楼 adlay 的回复:

/usr/include/4.9/c++/cmath  是头文件,它要找实现的文件

那它没找到,可是程序确实执行了这个函数,是不是表明gdb 默认情况下对 c++11的支持并不够全面呢?

程序执行的是编译后的机器码,它要找的是源代码

虽然程序没问题了,但是我还是不太明白,既然sqrt函数需要源文件来执行,并且执行成功了,为什么gdb找的时候没找到呢?这是不是说gdb调试还是有一些缺陷,还是我程序写的有问题,导致gdb 无法找到源文件?

引用 9 楼 wseektime 的回复:
Quote: 引用 8 楼 adlay 的回复:
Quote: 引用 6 楼 wseektime 的回复:
Quote: 引用 5 楼 adlay 的回复:

/usr/include/4.9/c++/cmath  是头文件,它要找实现的文件

那它没找到,可是程序确实执行了这个函数,是不是表明gdb 默认情况下对 c++11的支持并不够全面呢?

程序执行的是编译后的机器码,它要找的是源代码

虽然程序没问题了,但是我还是不太明白,既然sqrt函数需要源文件来执行,并且执行成功了,为什么gdb找的时候没找到呢?这是不是说gdb调试还是有一些缺陷,还是我程序写的有问题,导致gdb 无法找到源文件?

谁给你说sqrt函数需要源文件来执行的?
程序执行的时候是不需要源文件的

引用 10 楼 adlay 的回复:
Quote: 引用 9 楼 wseektime 的回复:
Quote: 引用 8 楼 adlay 的回复:
Quote: 引用 6 楼 wseektime 的回复:
Quote: 引用 5 楼 adlay 的回复:

/usr/include/4.9/c++/cmath  是头文件,它要找实现的文件

那它没找到,可是程序确实执行了这个函数,是不是表明gdb 默认情况下对 c++11的支持并不够全面呢?

程序执行的是编译后的机器码,它要找的是源代码

虽然程序没问题了,但是我还是不太明白,既然sqrt函数需要源文件来执行,并且执行成功了,为什么gdb找的时候没找到呢?这是不是说gdb调试还是有一些缺陷,还是我程序写的有问题,导致gdb 无法找到源文件?

谁给你说sqrt函数需要源文件来执行的?
程序执行的时候是不需要源文件的

文字游戏,不亦乐乎!

引用 10 楼 adlay 的回复:
Quote: 引用 9 楼 wseektime 的回复:
Quote: 引用 8 楼 adlay 的回复:
Quote: 引用 6 楼 wseektime 的回复:
Quote: 引用 5 楼 adlay 的回复:

/usr/include/4.9/c++/cmath  是头文件,它要找实现的文件

那它没找到,可是程序确实执行了这个函数,是不是表明gdb 默认情况下对 c++11的支持并不够全面呢?

程序执行的是编译后的机器码,它要找的是源代码

虽然程序没问题了,但是我还是不太明白,既然sqrt函数需要源文件来执行,并且执行成功了,为什么gdb找的时候没找到呢?这是不是说gdb调试还是有一些缺陷,还是我程序写的有问题,导致gdb 无法找到源文件?

谁给你说sqrt函数需要源文件来执行的?
程序执行的时候是不需要源文件的

算了,结贴吧,虽然你喜欢指出我的错误,但是并不能给出我要的答案。既然程序能正常运行,就不必纠结了。

引用 12 楼 wseektime 的回复:
Quote: 引用 10 楼 adlay 的回复:
Quote: 引用 9 楼 wseektime 的回复:
Quote: 引用 8 楼 adlay 的回复:
Quote: 引用 6 楼 wseektime 的回复:
Quote: 引用 5 楼 adlay 的回复:

/usr/include/4.9/c++/cmath  是头文件,它要找实现的文件

那它没找到,可是程序确实执行了这个函数,是不是表明gdb 默认情况下对 c++11的支持并不够全面呢?

程序执行的是编译后的机器码,它要找的是源代码

虽然程序没问题了,但是我还是不太明白,既然sqrt函数需要源文件来执行,并且执行成功了,为什么gdb找的时候没找到呢?这是不是说gdb调试还是有一些缺陷,还是我程序写的有问题,导致gdb 无法找到源文件?

谁给你说sqrt函数需要源文件来执行的?
程序执行的时候是不需要源文件的

算了,结贴吧,虽然你喜欢指出我的错误,但是并不能给出我要的答案。既然程序能正常运行,就不必纠结了。

有些基础的知识只能你自己去补充,如果你对代码的编译链接,程序运行,调试器工作原理,调试信息保存这些没有一个基本的概念,又怎能凭一两句话就解决掉心中的困惑。


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明g++ c++11 cmath 不能开平方???