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

我正在尝试使用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)

3 years ago

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

所以试试这个最终链接:

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

我一直这样做,以确保我的 生产环境 环境符合我的开发环境 .

3 years ago

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