【问题标题】:Create a statically linkable library in Freepascal在 Freepascal 中创建静态可链接库
【发布时间】:2014-03-31 19:24:48
【问题描述】:

我打算在 FPC 中编写一个可以从其他编译器链接到的库。动态链接(.so、.dll)没有问题,但是,来自(至少)gcc 和/或 clang 的静态链接的要求已经出现。

不知何故,最后,我需要一个包含所有 FPC 内部功能的对象存档,对吗?链接到 libc(cmem、cthreads 等)而不是 FPC 实现似乎是一个要求,但还有什么是最有效和跨平台的方法来实现这一点?

使用的 FPC 是 2.7(trunk)。

提前致谢。

编辑:已经取得了一些进展here(德语,也可以在我的评论中查看链接的仓库),但它让我觉得它既不优雅也不简单。还有 Marco 提出的关于初始化/完成的问题......

【问题讨论】:

    标签: linker static-libraries freepascal fpc


    【解决方案1】:

    我遇到了类似的问题,发现 this tutorial 真的很有帮助。它基本上是为 iOS 开发而编写的,这听起来要复杂得多,但对于常规的 C/C++ 链接来说工作得相当好。

    在我的例子中,一个遗留的 Delphi 项目被用于创建一个静态库:

    fpc -Cn -Mdelphi xxx.dpr
    ar -q libxxx.a `grep "\.o$" link.res`
    ranlib libxxx.a
    

    【讨论】:

    • 这只会为项目模块生成 .o 文件,但不包括其他系统 .o 文件以及项目库中使用的 .o 文件。因此,生成的 .a 文件比 .dll 小得多,而且不可移植。
    【解决方案2】:

    好吧,理论上你将每个 .o 与 AR 链接在一起,然后在启动时调用 FPC_INITIALIZEUNITS,在关闭时调用 FPC_FINALIZEUNITS。

    然而,FPC 可能会在主模块中生成一些信息(如包含所有单元 ini/fin 例程的地址的表)。我无法很快想到解决方案。

    【讨论】:

    • 关于 FPC_INITIALIZEUNITS 的要点。我已经用 BenBE 和我在此期间取得的一些进展更新了原始问题,但我认为我们完全忽略了这一点。你说得对,只为完整构建生成代码,我们通过构建一个库然后使用主对象从中提取一些部分来解决这个问题。但这不是最好的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2021-09-30
    • 1970-01-01
    • 1970-01-01
    • 2013-07-07
    • 1970-01-01
    • 1970-01-01
    • 2020-12-16
    • 1970-01-01
    相关资源
    最近更新 更多