1

我将一些代码从 MATLAB 移植到 C++,发现 MATLAB 的 sin() 和 cos() 函数与 C++ 库中的 sin() 和 cos() 函数产生的结果略有不同。为了消除这些差异,我希望我的 C++ 代码调用 fdlibm 5.3 库中的 sin() 和 cos() 函数,我认为这是 MATLAB 用于 sin() 和 cos() 操作的函数。

但是,我在使用 fdlibm 库时遇到了一些困难。我正在使用 Visual Studio 2010,并从http://www.validlab.com/software/下载了 fdlibm 头文件和源代码,但不确定使用这些文件的最佳方式。我是否需要先将文件构建到静态或动态库中,然后将其链接到我的代码?另外,我如何指定我想使用 fdlibm 中的 sin(),而不是 C++ 库中的?我是否需要修改 fdlibm 源代码以使 sin() 和 cos() 函数位于命名空间内?

非常感谢任何指导。

4

1 回答 1

0

本质上,您有两个任务要完成:

  • 您必须编译 fdlibm 源以生成适合您目的的目标模块。
  • 您必须将目标模块与您的其他目标模块链接起来。

我看到第一个任务有两个问题。第一,来自像 fdlibm 这样的项目的源代码通常被编写为可移植到许多系统,并且可能涉及大量的配置工作。它们可能不是非常简单的 C 或 C++ 代码,而是使用许多预处理器条件来选择某些选项,并且源代码进来的包可能有脚本来为编译做各种准备。

第二,您希望源代码符合 C++ 标准的声明sincos. 如果您拥有的 fdlibm 包支持 C++,这可能不需要您做任何工作。否则,您可能必须修改源以将sinandcos定义包装在 std 命名空间内,或者以其他方式修改源。

第二个问题是链接。不需要使用库。您可以简单地编译包含sincos生成一个(或多个)对象模块的源文件,然后将该(或多个)对象模块与您的其他对象模块链接。如果您愿意,您可以改为创建一个库,将目标模块sincos进入库,并将库与您的目标模块链接。使用最常见的链接器,您可以将库与目标模块链接起来,只需将其列为链接器的输入即可,与列出目标模块的方式相同。(一些链接器还有其他引用库的选项,但通常只需提供其正常文件路径就足够了。)您可以根据需要创建和链接静态库或动态库。如果您使用动态库,则它必须在可执行文件运行时存在。对于您自己使用的简单应用程序,无需使用动态库(甚至无需使用静态库;对象模块即可)。(本质上,库的目的是使将对象模块分发给其他人更容易,或者组织大型项目。简单的应用程序不需要库。)

关于链接的另一个注意事项:当您提供自己的 sin 和 cos 时,链接器有两种实现可供选择:您的 sin 和 cos 实现以及 sin 和 cos 的标准库实现。通常,标准库链接在任何用户指定的文件之后,因此仅指定您的目标模块或库就足以确保使用您的 sin 和 cos,而不是库的 sin 和 cos。如果不是这种情况,应该有链接器选项来更改考虑库的顺序。

于 2012-08-26T12:00:16.537 回答