我用math.h(Windows/Eclipse/CDT/MinGW)得到了不合理的结果 < >我正在编写C++代码,IDE使用Eclipse/CDT,作为编译器,我使用G++。 这是工作良好,但经过一些修改,我有一个标题的问题 事实上,对于exp、log和sqrt,我得到了不合理的结果。(例如,exp(0)=2或log(1)=17565120)

我用math.h(Windows/Eclipse/CDT/MinGW)得到了不合理的结果 < >我正在编写C++代码,IDE使用Eclipse/CDT,作为编译器,我使用G++。 这是工作良好,但经过一些修改,我有一个标题的问题 事实上,对于exp、log和sqrt,我得到了不合理的结果。(例如,exp(0)=2或log(1)=17565120),c++,linker,g++,shared-libraries,C++,Linker,G++,Shared Libraries,我检查过类似的问题。但是正如您在构建日志中看到的,链接器包含对libm.a库的引用 日志中的部分消息: g++-shared-Wl,--output def=definition.def-o toto.dll toto1.o tototo2.o toto3.o toto4.o toto5.o toto6.o tototo7.o-lpthreadGC2-lm 所以,我不明白为什么会出现这些错误 此外,如果我这样做,例如:nm toto.dll | find“exp”,我会得到:“68c0de38

我检查过类似的问题。但是正如您在构建日志中看到的,链接器包含对libm.a库的引用

日志中的部分消息: g++-shared-Wl,--output def=definition.def-o toto.dll toto1.o tototo2.o toto3.o toto4.o toto5.o toto6.o tototo7.o-lpthreadGC2-lm

所以,我不明白为什么会出现这些错误

此外,如果我这样做,例如:nm toto.dll | find“exp”,我会得到:“68c0de38 T|u exp”。因此,它让我认为函数exp有一个引用

在构建过程中,我没有收到有关的警告消息,头文件位于我的一个头文件中,该文件被其他人调用。 如果我左键单击“#include”,文件math.h将打开

为了确定问题的根源,我可以做些什么

附言:我可以从阅读评论中看到,我的描述不是很清楚。 使用以下公式出现问题:-log(at*exp(-bt*rt))/remainglife 在这个公式中,at、bt、rt和剩余寿命是双倍的-bt*rt=-0.0011072580657125247和exp(-bt*rt)=32。 我刚刚添加了一些使用eclipse的表达式功能得到的示例

第二点:当我在nm toto.dll中找到“exp”时,我也会得到:“68c2b1ec I_uuimp_uexp”

第3页:当我使用选项-E构建时,我可以在每个文件中看到只有一行函数exp的声明,它是来自MinGW\Include\math.h的“doubleattribute((cdecl)exp(double);”


感谢您的帮助。

您正在将返回值从
exp
log
转换为整数。不要这样做。

的输出中的
t
表示DLL定义了一个名为
\u exp
的“文本符号”。它并不意味着引用了
\U exp
:这将使用
U
。这个定义很可能与标准C库中的函数相冲突


定义的符号显然具有C-链接,因为它不包含已损坏functin参数的任何方面。也就是说,在一个C++文件中,它可以被定义为<代码>外部“C”/COD>,可能得到从“代码> >代码>的声明,而不是使用代码>外部“C”<代码>,或者是在C文件中定义。

,问题来自于Eclipse/CDT的Windows“表达式”的使用,在这种情况下返回错误的结果。 Matt McNabb是对的,这不是我代码中的问题。还有一个bug。


谢谢您的帮助。

您可以尝试使用双值吗?当然,例如:exp(1.5)return me 32和log(1.5)return me 6。实际上,
T
表示
exp
未被引用,但已定义!你应该去掉这个定义,我想你的问题会得到解决。但正如你在我之前的评论中所说的,当我使用double作为输入时,我也会遇到同样的问题。符号
\u exp
显然是一个未损坏的C-符号:你用你转储到正确位置的任何东西来调用它,它将根据其定义进行解释。看起来,您正在定义
double exp(double)
(可能带有附加参数,或者在C文件中,或者使用
extern“C”
),因为它似乎会产生更合理的结果。您的评论很有趣,但我已经在我的工作区中启动了对“exp”的搜索,我只得到一个结果,这不仅仅是函数exp的用法,它是:“_crtimpdouble u cdecl exp(double);“属于哪一个