我试图在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但在编译时遇到链接错误。请注意,我不是开发人员,因此我在这方面的经验有限。感谢。
答案 0 :(得分:0)
通常".a"
表示静态库。但是,在调整描述AIX 5共享库配置的初始报告(在2008中)时,存在一些错误传达,并且".a"
用于静态库和共享库。这最终在去年得到纠正(见changelog)。
打包者更喜欢共享库。所以你拥有的是一个名为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>
我一直这样做,以确保我的生产环境与我的开发环境相匹配。