【问题标题】:How to use multiple development languages如何使用多种开发语言
【发布时间】:2010-11-25 19:21:25
【问题描述】:

我在 Windows XP 上使用 Delphi(D7 和 D2006)编程(在不久的将来迁移到 Windows 7)。我需要为我正在做的一些工作使用数学库,并且我看过的大多数数学库(我目前倾向于 Mathematica)都会生成编译后的 C 代码。这样的代码将为我的主程序提供特定的功能。

我有一个非常基本的问题 - 鉴于此开发设置 - 我如何开始使用从 Delphi 编译的 c 代码?我真的需要一些小步骤来让我开始这个过程。

【问题讨论】:

  • 您打算使用 Mathematica 来生成 C 代码吗?
  • @Chris 感谢您的回答。您能否发布一个指向从 Mathematica 到 C 的转换软件/功能的指针?
  • 很抱歉,我也不明白您为什么要使用 Mathematica 进行代码生成。那里有非常好的数学库,高度优化,经过验证且稳定。也许您想更详细地描述您的问题,以便有人可以提示您使用什么。
  • @belisarius reference.wolfram.com/mathematica/guide/… 根本不是严格的转换,一个链接。
  • @Orbling 这就是我的怀疑......谢谢!

标签: c delphi dll wolfram-mathematica multilingual


【解决方案1】:

我已经用我的 FE 产品 OrcaFlex 做了很多这样的事情。您有两个选项可以从 Delphi 链接到您的 C 代码:静态或动态。我静态链接是因为它使分发和版本控制更加容易。但是让它静态工作确实是一个技巧,而且您必须依赖 Delphi 的许多未记录的方面。

我怀疑对于您的需求,动态链接是最好的。基本上,您需要将 C 代码编译并链接到 DLL 中。我建议使用 Borland C 编译器来执行此操作。您可以使用免费的命令行版本 BCC55 来执行此操作。使用 Borland C 的优势在于它对 8087 浮点单元的假设与 Delphi 所做的相同。如果您使用 MSVC 构建,那么您会发现 MS 已选择不引发浮点异常。 Borland C 确实引发了浮点异常。这是一个极端的案例,但如果您尝试发布需要强大的产品,它就会变得相关。

您应该知道,默认情况下,C 代码将使用 C 调用约定,我会坚持使用它。您可以通过将外部例程声明为 cdecl 调用约定将其引入 Delphi。

您需要注意的另一件事是在两个模块之间定义一个清晰的接口。您需要确保异常不会越过模块边界,并且您不会越过边界传递任何特殊类型(例如 Delphi 字符串)。因此,对于字符串,请使用 PChar(或者更好的 PAnsiChar 或 PWideChar,以确保在升级到 Delphi 2009 及更高版本时它不会改变含义)。

【讨论】:

    【解决方案2】:

    我对 Lohninger (http://www.lohninger.com/mathpack.html) 的 SDL 库非常满意。它是用 Delphi 编写的,可以直接编译到您的应用程序中,因此不存在捆绑或调用约定问题或浮点使用差异,正如该线程中的其他响应所讨论的那样。

    看看他包含的内容。如果你幸运的话,他的图书馆会满足你的需求,你就可以使用它了!

    【讨论】:

    • 我确实查看了 SDL 库,它看起来确实非常有用。但是,它不支持我特别想要的功能。我现在已经使用了 TPMath。谢谢
    【解决方案3】:

    如果您当前安装了 Mathematica,请转到文档中心并查找 guide/CLanguageInterface 否则该指南是 available on the web 并在那里好好阅读。

    我的理解是,如果您需要完整的功能,或者如果您只需要较低级别的功能,那么 Mathematica 可以生成通过 MathLink 与 Mathematica 引擎链接的 C 程序,那么它能够生成可以静态链接的代码编译的 Mathematica 库。所以独立代码是可能的。

    请参阅Code Generator documentation

    如果您可以将 C 程序转换为 DLLs,那么通过 external 声明从 Delphi 访问此类外部函数相对简单。

    function MathematicaRoutine(const x : double) : double; external 'MyInterface.dll';
    

    如果您需要实现静态绑定,在未安装 Mathematica 的情况下使用(如果确实有可能),那么要使其工作肯定会有很多复杂性。我从来没有尝试过。

    【讨论】:

      【解决方案4】:

      您可以使用 RAD Studio 将您的项目与 Delphi 和 C++ (Builder) 代码混合。将自动创建的 C 代码放入 C++ Builder 文件 (.cpp),然后添加 Delphi 文件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-27
        • 1970-01-01
        • 1970-01-01
        • 2015-02-23
        • 1970-01-01
        • 2020-11-17
        相关资源
        最近更新 更多