【问题标题】:How to static link ncurses on AIX using xlc如何使用 xlc 在 AIX 上静态链接 ncurses
【发布时间】:2015-06-21 10:40:18
【问题描述】:

我正在尝试使用 AIX 7.1 上的 ncurses 库来利用 AIX 上标准的 curses 库中未包含的面板。我安装了 ncurses 库。编译、链接和执行工作正常: xlc ngoodbye.c -lncurses 实际的 ncurses 库是 libncurses.a,我理解它是一个静态库。但是,当我将可执行文件移动到另一个 AIX 主机并执行时,我得到: 无法加载依赖模块 libncurses.a(libncurses.so.5)。无法加载模块 libncurses.a(libncurses.so.5)。系统错误:没有这样的文件或目录。

如何链接 ncurses 库,以便程序在未安装 ncurses 库的其他主机上执行?注意我在 AIX 上使用 xlc,而不是 gcc。 我试过 -bstatic 但在编译时出现链接错误。请注意,我不是开发人员,因此我在这方面的经验有限。谢谢。

【问题讨论】:

    标签: aix ncurses xlc


    【解决方案1】:

    AIX 中的静态库和共享库都构建为与位置无关 (PIC)。因此,即使是“共享”库也可以静态绑定到可执行文件。您在使用 -bstatic 时走在了正确的轨道上,您只需要为要链接的其余库切换回动态绑定即可。

    所以试试这个作为你的最终链接:

    xlc -o myexe myexe.o <other objects as needed> -bstatic -lncurses -bdynamic -lm <and other other libraries as needed>
    

    我一直这样做是为了确保我的生产环境与我的开发环境相匹配。

    【讨论】:

    • 但是如果库是动态的,则切换无效。
    • 这个答案对我有用..即:xlc myexe.c -bstatic -lncurses -bdynamic。非常感谢您的快速回复。这是我在这里的第一个问题,所以显然还不能投票给答案。
    • 它在 AIX 上以这种方式工作,@ThomasDickey。它确实确实将库绑定到可执行文件中,就像静态库/目标文件一样。在这方面,AIX 的工作方式与大多数其他 unix 不同。
    【解决方案2】:

    通常".a" 确实意味着静态库。然而,在改编描述 AIX 5 共享库配置的初始报告(2008)时,出现了一些误传,".a" 用于静态库和共享库。去年终于纠正了这一点(请参阅changelog)。

    顺便说一下,AIX 4 使用了一个更复杂的方案,因此 ncurses 的共享库首先在 AIX 5 上实现。

    打包者更喜欢共享库。因此,您拥有的是一个名为libncurses.a 的共享库(合法,但不传统)。这不是使用归档程序ar 创建的,而是使用加载程序ld 创建的。看他们不一样,你可以试试

    ar tv libncurses.a
    

    (使用适当的目录)。 ar 可能会说类似

    ar: 0707-108 File libncurses.a is not an archive file.
    

    虽然file 可能会提供更多信息:

    libncurses.a: executable (RISC System/6000) or object module not stripped
    

    但是,您可以从源代码构建 ncurses。在这种情况下(无论是什么版本),默认构建静态库。您无需将它们安装到系统区域,但可以使用 --prefix 选项配置 ncurses 以安装到不同的目录。

    正如另一个答案中所建议的,使用 AIX 的 ld(加载器)的 -bdynamic-bstatic 选项有一个解决方法,例如,更改

    xlc -o foo foo.c -lncurses
    

    xlc -o foo foo.c -bstatic -lncurses -ldynamic
    

    但是,这部分取决于加载程序的搜索路径和存档的名称。如果存档名为libncurses.a,则该命令按给定的方式工作。如果它被命名为libncurses.so(在当前的源代码中),那么需要这个命令来链接共享库:

    xlc -o foo foo.c -brtl -lncurses
    

    但是这个命令(有人可能认为它使用libncurses.so 文件提供静态链接)没有成功:

    xlc -o foo foo.c -brtl -bstatic -lncurses -bdynamic
    

    【讨论】:

    • 在传统的 unix 中,.a 后缀是由 ar 生成的存档。它既不是静态的也不是共享的,而是一组文件——通常目标文件不需要是目标文件。目标文件可以是共享的或静态的。它们也可以是不同的位大小,在同一存档中具有 32 位和 64 位目标文件。例如,您可以转储 libc.a 并在同一个存档中找到所有四种类型。
    猜你喜欢
    • 2013-03-04
    • 2010-09-26
    • 1970-01-01
    • 2013-03-11
    • 2011-03-31
    • 1970-01-01
    • 2015-12-28
    • 2012-04-05
    • 2012-05-02
    相关资源
    最近更新 更多