5

我一直在包括<string.h>所有地方,当我去包括的那一刻<math.h>pow()我发现我需要修改我的 makefile 才能访问pow.

如果需要包含它们,我也不知道在哪里可以查找更多库。我随机读到该-lm标志(或至少是其中的标志m)表示标准 c 数学库,但我不知道可能会调用其他任何标准 c 库。

我只是看了看,user/local/lib我看到的是:

$ cd /usr/local/lib
$ ls -al
drwxr-xr-x  3 root root  4096 Apr 25  2012 .
drwxr-xr-x 10 root root  4096 Apr 25  2012 ..
drwxrwsr-x  4 root staff 4096 Oct 14 10:19 python2.7
4

4 回答 4

6

string.h是对标准库模块的头文件引用,但由于历史原因math.h不是对标准库模块的头文件引用。编译程序时,默认情况下,链接器中通常只包含标准库。

在某个时间点,人们可能会用libm.so math.h针对内存、CPU 性能等进行了更好优化的其他实现来替代实现。实际上,没有一个libm.so“默认”实现。然而,大多数系统至少提供了一个实现。该实现位于默认库位置,libm.so并将与-lm.

如果您有一个更快(甚至可能以不太准确为代价)并且您理解可以使用的库,那么您就有能力覆盖系统提供的math.h libm.so实现。

早期的 CRAY 系统(我没有研究过)确实优化了一些数学实现以不进行正确的“完整”数学运算,理解为获得 100% 正确的答案,您将“完成”装配操作由于计算中有效数字的数量,通常不重要的代码。(根据我对华盛顿特区密码学博物馆展览的理解)

多个实现的问题在于您现在有一个选择,而标准 C 库的结构并未为您提供实现的选择。

于 2013-10-22T18:37:25.457 回答
2

为您提供有关帖子另一方面的更多信息,查找库在您机器上的位置将取决于操作系统。看起来您正在使用带有 bash 的操作系统,您会在/usror/usr/local文件夹中找到大多数库(也许我不应该说最多,但它一直是我使用过的许多库的默认安装位置,例如 boost)。然而,这不是 c++ 库倾向于安装的位置。

我的 c++ 库位于标有 的文件夹中,这使得使用该工具lib可以轻松搜索它们。find类似的东西find / -iname "*lib*" 2>/dev/null应该可以帮助您找到可能安装了库的任何位置,您需要告诉链接器。2>/dev/null(如果你想要sudo这个命令 ,你可以忽略)。

最近我在让我的 IDE 与 boost 配合使用时遇到了很多麻烦,所以希望这有助于您将来在链接库时可能遇到的任何麻烦。

编辑:我想添加一些关于如何告诉你的 IDE 关于库的信息。使用该find工具,查找所有名为的文件夹将include导致任何应包含在 IDE 编译器中的Additional Include Directories文件夹(不是所有名为include/usr/local/include/boost搜索结果所示)。我之前提到的如何查找的库将被添加到下面的链接器部分中,Additional Library Directories以便他们知道在哪里专门查找这些库。

编辑 2:要提供有关在 Windows 上哪里可以找到适当文件的一些信息,搜索有点困难。似乎并没有开发人员安装到的“标准”位置(如果有的话,它可能是当前用户的主目录,但这远不是唯一使用的位置)。此外,findWindows 上的功能并不那么简单或有用(在我看来)。最重要的是,特别是对于 c++ 文件,它将完全基于您获得文件的方式。例如,如果您使用的是 Visual Studio,它们位于 Visual Studio 的 c++ 部分的文件夹内(即C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\在我的机器上)但是如果您使用可以从 MinGW 获得的文件,它将位于不同的位置。我在这里唯一的建议是在您选择的位置创建一个文件夹(我直接在 C: 中使用了一个文件夹)来手动安装您添加到系统中的所有内容。

例如,Boost 允许在安装时轻松更改默认安装路径。大多数创建的工具(我更愿意在这里说几乎所有)都具有此功能,尤其是在 Windows 上。否则,搜索特定于您添加的每个实用程序的默认位置或学习使用findWindows 提供的实用程序都是可行的选择。

于 2013-10-22T18:55:00.417 回答
1

标准 C 库函数都在中定义libc,您不必将其链接到您的程序,因为它是由链接器在链接器时自动完成的。唯一的例外是数学函数。它们被放在一个名为libm. 由于与 UNIX 上的 Fortran 编译器相关的历史原因,它们被放入了一个单独的库中(我没有任何来源支持这种说法)。

于 2013-10-22T18:36:58.400 回答
0

数学库的实现(通常)分为两部分。

<math.h>是一个头文件,通常是/usr/include/math.h. 它是 C 源代码,它告诉编译器如何生成对pow其他函数的调用。它应该默认可用;您只需要#include <math.h>,编译器就会知道在哪里可以找到它。(所以你的标题有点误导。)

中声明的函数在一个库文件<math.h>实现,其中包含可以链接到您的程序中的预编译可执行代码(在它被编译之后)。由于历史原因,默认情况下通常不会搜索该库,您必须指定一个附加-lm选项来告诉链接器在哪里找到它。(这被广泛认为是一个错误;另一方面,默认情况下不搜索数学库会使链接速度稍微快一些,并且大多数 C 程序不使用数学库。)

于 2013-10-22T19:44:46.870 回答