标签: libm

为什么即使我包含math.h标题,我也会收到"对sqrt的未定义引用"错误?

我是C的新手,我有这个代码:

#include <stdio.h>
#include <math.h>
int main(void)
{
  double x = 0.5;
  double result = sqrt(x);
  printf("The square root of %lf is %lf\n", x, result);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是当我编译它时:

gcc test.c -o test
Run Code Online (Sandbox Code Playgroud)

我收到这样的错误:

/tmp/cc58XvyX.o: In function `main':
test.c:(.text+0x2f): undefined reference to `sqrt'
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

为什么会这样?是sqrt()不是在math.h头文件中?我cosh和其他三角函数有同样的错误.为什么?

c linker linker-errors libm

98
推荐指数
5
解决办法
19万
查看次数

gnu lib math(libm)源代码在哪里

我想下载并编译libm的源代码(GNU的可能库).

有人能指出我正确的位置/存储库吗?

gnu libm

13
推荐指数
1
解决办法
1万
查看次数

我*不*想要函数exp的正确舍入

Debian系统上的C数学库的GCC实现显然符合(IEEE 754-2008)函数的实现,这意味着舍入应始终是正确的:exp

(来自维基百科)IEEE浮点标准保证加,减,乘,除,融合乘加,平方根和浮点余数将给出无限精度运算的正确舍入结果.对于更复杂的功能,1985年标准中没有给出这样的保证,它们通常只能在最后一点内准确到达.但是,2008标准保证符合要求的实现将给出正确的舍入结果,这些结果遵循主动舍入模式; 但是,函数的实现是可选的.

事实证明,我遇到了这个功能实际上阻碍的情况,因为exp函数的确切结果通常几乎恰好处于两个连续double值(1)之间的中间位置,然后程序进行了大量的进一步计算,失去了速度高达400(!):这实际上是对我的解释(不好问:-S)问题#43530011.

(1)更确切地说,当参数exp变为(2 k + 1)×2 -53,其中k为相当小的整数(例如242)时,就会发生这种情况.特别是,所涉及的计算pow (1. + x, 0.5)倾向于exp使用这样的参数进行调用x,其数量级为2 -44.

由于正确舍入的实现在某些情况下可能非常耗时,我想开发人员也会设计一种方法来获得稍微不那么精确的结果(例如,最多只有0.6 ULP或类似的东西)对于给定范围内的每个参数值(大致)有界限...(2)

......但是怎么做?

(2)我的意思是,我只是不希望像(2 k + 1)×2 -53这样的参数的某些特殊值比相同数量级的大多数值更耗时; 但是我当然不介意参数的某些特殊值是否更快,或者如果大参数(绝对值)需要更大的计算时间.

这是一个显示现象的最小程序:

#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <time.h>

int main (void)
 {
  int i;
  double a, c;
  c = 0;
  clock_t start = clock …
Run Code Online (Sandbox Code Playgroud)

c rounding ieee-754 exp libm

11
推荐指数
1
解决办法
330
查看次数

NDK:libm静态链接

在尝试使用最近的android-9 x86平台编译源代码时遇到问题.

主要问题:为什么静态库libm.a和动态libm.so不同?

问题是我试图编译:

/path/to/android-ndk-r8/toolchains/x86-4.4.3/prebuilt/linux-x86/bin/i686-android-linux-gcc --sysroot =/path/to/android-ndk-r8/platforms/android-9/arch-x86 -I/path/to/android-ndk-r8/sources/cxx-stl/gnu-libstdc ++/include -I/path/to/android-ndk-r8/sources/cxx-stl/gnu-libstdc ++/libs/x86/include -L/path/to/android-ndk -r8/sources/cxx-stl/gnu-libstdc ++/lib -L ​​/ path/to/android-ndk-r8/platforms/android -9/arch-x86/usr/lib -static /path/to/gcc_4_4_6_release/gcc/testsuite/gcc.dg/complex-5.c-std = c99 -O -ffloat-store -o ./complex-5. exe -lm

但我有未定义的参考:

/tmp/cc78CsCp.o:在函数main': complex-5.c:(.text+0x1a2): undefined reference tofeclearexcept'complex-5.c :(.text + 0x1b3):未定义引用`fetestexcept'colle2:ld返回1退出状态

pwd:/ path/to/android-ndk-r8/platforms/android-9/arch-x86/usr/lib

ls libm*libm.a libm.so

它存在,但是如果我们用nm来表示feclearexcept,它就不存在于静态库中.

好的,只是尝试删除-static标志.

/path/to/android-ndk-r8/toolchains/x86-4.4.3/prebuilt/linux-x86/bin/i686-android-linux-gcc --sysroot =/path/to/android-ndk-r8/platforms/android-9/arch-x86 -I/path/to/android-ndk-r8/sources/cxx-stl/gnu-libstdc ++/include -I/path/to/android-ndk-r8/sources/cxx-stl/gnu-libstdc ++/libs/x86/include -L/path/to/android-ndk -r8/sources/cxx-stl/gnu-libstdc ++/lib -L ​​/ path/to/android-ndk-r8/platforms/android -9/arch-x86/usr/lib /path/to/gcc_4_4_6_release/gcc/testsuite/gcc.dg/complex-5.c -std = c99 -O -ffloat-store -o ./complex-5.exe - LM

好.那个问题:他们为什么不同?我需要静态链接,我不想强​​制使用动态链接-Wl,-Bdynamic -lm.顺便说一句:常规linux …

x86 static android android-ndk libm

8
推荐指数
0
解决办法
1684
查看次数

如何在Android NDK中使用complex.h?

我有用C编写的本机源代码,我想在我的Android设备(Nexus 7)上运行.我已经成功地使用Android NDK在Android上运行本机代码进行了大量研究和在线教程.我对此有了一些了解.但是,我所使用的代码利用了complex.h中定义的标准数学库的复杂功能.然而,NDK C库似乎不支持复杂的功能.每当我对项目进行ndk-build时,我得到:

fatal error: complex.h: no such file or directory.
Run Code Online (Sandbox Code Playgroud)

作为一个解决方案,我想从arm-linux-gnueabi获取标准数学库(libm.a)并将其与我的本地源链接.这是我的Android.mk:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := StandardC
LOCAL_SRC_FILES := libc.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := mathLib
LOCAL_SRC_FILES := libm.a
LOCAL_STATIC_LIBRARIES := StandardC
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := ComplexOperations
LOCAL_SRC_FILES := libComplexOperations.a
LOCAL_STATIC_LIBRARIES := mathLib
LOCAL_C_INCLUDES += /usr/arm-linux-gnueabi/include
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := MySource
LOCAL_CFLAGS += -std=c99
LOCAL_SRC_FILES := com_samuel_test_ComplexOperationsLib.c
LOCAL_C_INCLUDES += /usr/arm-linux-gnueabi/include
LOCAL_STATIC_LIBRARIES := ComplexOperations
include $(BUILD_SHARED_LIBRARY)
Run Code Online (Sandbox Code Playgroud)

我不得不链接arm-linux-gnueabi-gcc的libc以及libm需要它.使用arm-linux-gnueabi-gcc和编译器标志-march = armv7-a静态编译"ComplexOperations"模块.该库使用complex.h.这种构建没有任何错误和警告.但是当我运行应用程序并打电话时

System.loadLibrary("MySource");
Run Code Online (Sandbox Code Playgroud)

我在logcat上遇到这个错误: …

glibc loadlibrary cross-compiling android-ndk libm

8
推荐指数
1
解决办法
3173
查看次数

在C中使用pow时,CMake是否可以检测是否需要链接到libm?

对于某些编译器,在C程序中使用pow和某些其他功能需要链接到m.但是,某些编译器不需要这样做,并且在链接到m库时会出错.对于带有std::thread和的C++,存在几乎完全相同的情况pthread,但是CMake模块FindThreads完全缓解了这种情况 - 是否有一些类似于libm的模块?

检测CMake如何处理的最佳方法是什么?这是我目前的解决方案,这不太理想,因为有更多的C编译器,而不仅仅是GCC和MSVC:

if(NOT MSVC)
    target_link_libraries(my-c-target PUBLIC m)
endif()
Run Code Online (Sandbox Code Playgroud)

这适用于我的目的,但我很确定有些情况会失败并需要手动用户干预,这对于不了解这种默默无闻的人来说并不好玩.理想情况下,我不希望用户必须通过命令行指定他们的编译器是否很奇怪 ; 我想在CMake中自动检测它,因为这是CMake的全部内容.

c gcc cmake libm

7
推荐指数
2
解决办法
3704
查看次数

为什么数学函数没有静态库?

只有动态库大多没有静态版本才是标准吗?我特别询问数学库.在我的fedora 17(Intel 32处理器上的linux机器)上,我有最新的gcc,它有libm-2.15.so和符号链接文件libm.so,但是没有libm.a.

我的系统上是否缺少libm.a?

c linux gcc fedora libm

6
推荐指数
1
解决办法
6528
查看次数

什么是libc?它包含哪些功能?我们怎样才能得到它的源代码?

根据Wikipedia,有许多基于操作系统和编译器的标准C库变体.参考:http://en.wikipedia.org/wiki/C_standard_library

  1. 但我想了解在单个库中定义了在不同标头中声明的大量函数(例如:stdio.h,string.h,stdlib.h等).所有这些头文件的源代码文件是否相同,或者stdio.h,string.h等有不同的库?由于我是编程的初学者,我不知道多个源代码文件是否可以生成像可执行文件这样的单个库.如果可能,那么我可以理解libc包含所有标准头文件的定义.我在哪里可以看到标准C库的源代码?

  2. 它是静态库还是动态库?如果我的环境(OS/IDE)中存在两个版本,当我在源代码中包含任何标准头文件时,会将其链接起来.它依赖于IDE吗?但是对于gcc,程序员没有明确地包含libc.

  3. libc是标准C库的标准名称吗?

  4. 在Windows操作系统/环境中它是否已经存在?如果它存在,它的名称是什么(仅限libc)?

  5. 还有像libm这样的其他标准C库吗?

c standards libc standard-library libm

6
推荐指数
1
解决办法
1253
查看次数

libm 用于哪些功能?

据我所知,一些数学函数包含在 libc 中,而另一些则包含在 libm 中。我通过实验发现:

$ nm --dynamic --defined-only /lib/x86_64-linux-gnu/libm.so.6 | grep -w abs 
$ nm --dynamic --defined-only /lib/x86_64-linux-gnu/libc.so.6 | grep -w abs 
T abs
Run Code Online (Sandbox Code Playgroud)

是否有关于 libm 必须提供哪些数学函数的要求?libc 和 libm 是否一起提供 C 标准所需的所有数学函数?

c linux glibc libc libm

6
推荐指数
1
解决办法
6315
查看次数

Libm针对ARM进行了优化?

是否存在针对ARM(v6)处理器优化的libm(libmath)?

我正在研究GNU实现,它似乎没有被优化(但它确实有x86).似乎libm的大多数实现都没有ARM特定的优化.

math arm libm

5
推荐指数
1
解决办法
630
查看次数