数学库现在包含在 glibc 中吗?

2024-04-07

当我尝试从终端编译这个简单的代码时:

#include<stdio.h>

int main(void)
{

    printf("%f\n",sqrt(10));

    return 0;
}

using

gcc main.c

命令,它被编译并且 a.out 给出正确的答案。这意味着数学函数被添加到自动链接的 C 标准库中。

但是,如果在 Eclipse IDE 中编译相同的代码而不向属性添加任何库,则会出现未定义的引用错误。这意味着数学函数不是 C 标准库的一部分。

真相是什么?


你可能会看到不断折叠 https://en.wikipedia.org/wiki/Constant_folding在这里,在数学函数调用中使用常量将导致编译器计算该函数并忽略对数学库的调用。

如果我们查看文档GCC提供的其他内置函数 http://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html#Other-Builtins says(强调我的):

GCC 包含标准 C 库中许多函数的内置版本。以 _ 为前缀的版本builtin即使您指定了 -fno-builtin 选项,它们也始终被视为与 C 库函数具有相同的含义。 (请参阅 C 方言选项)其中许多函数仅在某些情况下进行优化;如果它们在特定情况下未优化,则会发出对库函数的调用。

如果我们看看这个稍微修改一下实例 http://coliru.stacked-crooked.com/a/32d13721bb731192它使用以下代码:

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

int main(void)
{

    printf("%d\n",(int)sqrt(25));

    return 0;
}

我们看到以下生成的程序集gcc:

movl    $5, %esi        
movq    %rax, %rdi
movl    $0, %eax
call    printf

所以我们看到5被移入esi其中在x64 abi http://x86-64.org/documentation/abi.pdf是调用函数的第二个参数,是以下结果sqrt(25)没有电话sqrt at all.

请注意您缺少:

#include <math.h>

Update

内置是一个海湾合作委员会扩展 http://gcc.gnu.org/onlinedocs/gcc/C-Extensions.html#C-Extensions上面的内置链接解释了哪些函数在哪种模式下使用,并且它们都应该与标准函数具有相同的含义。

如果您担心您的代码是否符合标准,那么您可以查看控制 C 方言的选项 http://gcc.gnu.org/onlinedocs/gcc/C-Dialect-Options.html#C-Dialect-Options手册的部分。您可以使用-std指定您想要遵守的标准以及-pedantic当您使用不符合标准或不符合标准的功能时启用警告-pedantic-errors使警告成为错误。例如使用

gcc -std=c99 -pedantic

当您使用符合以下要求的功能时,会生成警告C99标准例如零长度数组 http://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html#Zero-Length.

我们还可以使用-fno-builtin要禁用一些内置函数,文档说:

无法识别不以 _ 开头的内置函数builtin作为前缀。有关受影响函数的详细信息,请参阅 GCC 提供的其他内置函数,包括那些在使用严格 ISO C 一致性的 -ansi 或 -std 选项时非内置函数的函数,因为它们不具有 ISO 标准含义。 [...]

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数学库现在包含在 glibc 中吗? 的相关文章

随机推荐

  • 如何将SQL用户自定义函数添加到实体框架中?

    我可以像在 dbml 中那样向 edmx 文件添加 SQL 函数吗 如果可以的话 我该怎么做 如果我不能 有什么解决方法吗 我尝试谷歌 但找不到任何关于如何做到这一点的具体答案 根据给定的答案 我创建了一个存储过程并尝试添加 导入函数 但它
  • java 7 接口中默认方法的替代方案(仅在 Java 8 中)

    我想在我的一个接口类中使用默认方法 然后我意识到这仅在 Java 8 中可用 而我们正在使用 Java 7 在 Java 7 中实现类似的最佳方法是什么 将方法签名放在接口中 就像 Java 8 中一样 将您的方法默认实现放在实现该接口的抽
  • 无法通过代理建立隧道。代理通过 https 返回“HTTP/1.1 407”

    我尝试通过需要身份验证的 https 连接到服务器 此外 我中间有一个也需要身份验证的 http 代理 我使用 ProxyAuthSecurityHandler 向代理进行身份验证 使用 BasicAuthSecurityHandler 向
  • Rails 资源未更新

    我有一个 Rails 3 1 应用程序 由于某种原因 当我更改 CSS 时 更改不会显示 我做到了bundle exec rake assets precompile它曾经有帮助 但现在无论如何我都坚持使用旧的CSS 由于您的资产现已预编译
  • 如何使用 Window() 计算 PySpark 中的滚动中位数?

    如何计算前 3 个值的窗口大小的美元滚动中位数 输入数据 dollars timestampGMT 25 2017 03 18 11 27 18 17 2017 03 18 11 27 19 13 2017 03 18 11 27 20 2
  • “rails server”命令在终端中不起作用

    我对 Rails 还很陌生 正在尝试设置一个非常简单的测试站点 我使用以下命令创建了新的 Rails 应用程序目录rails new命令 但无法设置服务器以在浏览器中查看页面 以下是我尝试时收到的消息rails server MacBook
  • PyCryptodome 错误:MAC 检查失败

    我正在 Python 3 中使用 Pycryptodome 开发一个加密程序 我试图加密一个 字节 字符串 然后解密它并验证 MAC 标签 当我验证它时 会抛出错误 这是代码 from Crypto Cipher import AES fr
  • boost :仅迭代 ptree 的元素

    这应该很简单 我只是在学习提升 所以我错过了一些东西 我已经使用 json read 读取了一些简单的 JSON 现在有了一个 ptree 网络上的所有示例都显示使用 ptree get entry name 来获取条目 我想做的就是 pt
  • 在 AngularJS 中加载图像目录

    我正在尝试在我的 Angular 应用程序中实现一个图片库 我已经在这篇文章中管理了图片的上传 文件上传 如果目录不存在则创建 https stackoverflow com questions 30150646 file upload c
  • Rcpp 和 boost:它应该可以工作,但不能

    我对在以下位置找到的有趣帖子有疑问 具有四精度计算的 Rcpp https stackoverflow com questions 42262963 rcpp with quad precision computation I use Rc
  • 在 Pygame 中获取等距平铺鼠标选择

    I m not managing to get this math correct and it s a little bit difficult to explain in words I have managed to create a
  • 我可以使用具有固定输入的“map”吗?

    假设我这样做f x y 2x ythen map f 2 4 6 1 1 1 我会得到 3 element Array Int64 1 5 9 13 If I do map f 2 4 6 1 即我想假设第二个输入始终相同 我会得到 1 e
  • Django admin TabularInline - 有没有添加自定义 html 列的好方法?

    我有一个模型 Entry 其中包含一个简单的属性 property def image self return str self id self round season name self round theme self person
  • 为什么 PyCharm 使用双反斜杠来表示转义?

    例如 我编写一个正常字符串和另一个 异常 字符串 如下所示 现在我调试一下 发现在调试工具中 异常 字符串会显示如下 这是问题 为什么 PyCharm 显示双反斜杠而不是单个反斜杠 众所周知 means 有什么窍门吗 我相信正在发生的是 在
  • Lync - 与 ContactEndpoints 行为不一致

    我正在为基于 Lync 的公司目录开发自定义 UI 我使用 Lync 2013 执行此搜索 Container Instance Lync ContactManager BeginSearch SearchQuery SearchProvi
  • 转储数据库并以新名称重新导入

    如果我需要使用 MySQL 将数据库 foo 的内容复制到第二个数据库 bar 中 我通常会这样做 mysqldump u root foo gt foo sql mysql u root e CREATE DATABASE bar mys
  • 将 EJB Jar 部署到 Glassfish 时出现异常

    这是我第一次尝试使用 JMS 我已经成功创建 部署了一个 war 文件 其中包含一个可用于上传文件的 servlet 上传文件时 它会向 JMS 队列发送一条消息 接下来 我编写了一个侦听器来从队列中检索上传的消息 但是当我尝试部署它时 出
  • 如何查看.so文件的目标文件内容

    如何查看 o文件构成 so文件 意味着如何注意到哪些目标文件用于从 so 文件构建 so 文件 如果我只有 so 文件 你不能know 给定一个共享库 目标文件是什么 编译到其中 如果你幸运的话 你也许能够做出合理的猜测 共享库是由链接器从
  • iOS 模拟器在 iOS 8.2 和 Xcode 6.2 中崩溃,并显示“成功启动后无法查找 #ID 的进程 ID”。

    iOS 模拟器在 iOS 8 2 和 Xcode 6 2 中崩溃 并出现以下错误 成功启动后无法查找xxx xxx xxx的进程ID 可能是启动后崩溃了 没有这样的进程 我无法尝试模拟我的应用程序 我上传了错误的图片 https i sta
  • 数学库现在包含在 glibc 中吗?

    当我尝试从终端编译这个简单的代码时 include