【问题标题】:What is a library unit in Chicken Scheme?养鸡计划中的图书馆单元是什么?
【发布时间】:2017-03-13 13:44:11
【问题描述】:

网站上的许多地方都使用了术语“单元”和“图书馆单元”,但我找不到这些术语的文档甚至定义。我发现的唯一描述是在“用户手册/支持的语言/声明/(单位|使用)”中。在“用户手册/使用编译器/包含多个文件的示例”中也有一个示例。如您所见,非常稀缺。

如果我得到回复,下一个问题是“单元”与“用户手册/支持的语言/模块”中描述的模块有什么关系?我认为“单元”与编译有关,而模块与方案值名称有关。

【问题讨论】:

    标签: scheme chicken-scheme


    【解决方案1】:

    Unit 是“编译单元”的缩写,基本上是一个编译库。如果您查看 CHICKEN 的源代码,您会注意到手册中的每个单元(大致)对应于一个源文件。每个源文件单独编译成.o文件,这些单元都链接在一起成为libchicken.so/libchicken.a

    这个术语不再是很相关了,除非你是静态链接的。然后你需要(declare (uses ...)),它指的是单位名称。这是必需的,因为特定单元的顶层需要在依赖它的顶层之前运行,以便加载任何定义。

    在现代代码中,您通常只会使用模块,但这意味着您的代码不能静态链接。我们知道这很令人困惑,这就是为什么我们尝试使用 CHICKEN 5 使与模块的静态链接更容易,并减少了解单位的需要。

    【讨论】:

    • 什么是“编译库”?是“.o”文件、“.a”文件还是“*.so”文件?
    • 我想单独编译一个可执行文件(“o”文件)的一部分。 (首先,我忽略了未更改的部分的编译。其次,我也用 C 编写。)链接器(“csc”和“gcc”)无法链接“o”文件,并出现错误“`C_toplevel 的多重定义” '" 如果“scm”文件不包含“declare (unit ...)”。所以我需要了解这些“单位”。这不应该被隐藏。
    • 我想在一组“scm”文件中进入一个可执行文件,每个文件都应该包含一个唯一的单元名称?
    • 如果你想使用单独编译,你确实需要显式声明一个单元(或使用-unit 标志),否则编译器会假设你正在创建一个带有标准入口点(除非您使用-dynamic 创建共享对象文件)。
    • 恕我直言,从多个源代码文件编译可执行文件或共享对象文件的情况很常见。
    猜你喜欢
    • 1970-01-01
    • 2018-10-25
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    • 2018-07-23
    • 1970-01-01
    • 1970-01-01
    • 2014-04-01
    相关资源
    最近更新 更多