如何使用xlc在AIX上静态链接ncurses

时间:2015-04-15 12:52:05

标签: aix ncurses xlc

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

2 个答案:

答案 0 :(得分:0)

通常".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

答案 1 :(得分:0)

AIX中的静态库和共享库都构建为位置无关(PIC)。所以即使是共享"库可以静态绑定到可执行文件。你使用-bstatic进入了正确的轨道,你只需要切换回动态绑定你正在链接的其他库。

请尝试使用此链接:

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

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