0

我正在尝试使用 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 但在编译时出现链接错误。请注意,我不是开发人员,因此我在这方面的经验有限。谢谢。

4

2 回答 2

0

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

顺便说一下,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.

whilefile可能会提供更多信息:

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

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

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

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
于 2015-04-15T23:33:51.960 回答
0

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

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

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

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

于 2015-04-16T16:22:03.787 回答