我正在尝试使用gcc 4.2.0在AIX 6.1上编译omniORB。
初始化不起作用,因为它正在拾取非pthreaded库。
如果我将LIBPATH设置为/opt/freeware/lib/gcc/powerpc-ibm-aix6.1.0.0/4.2.0/ omniNames将无效,因为streams接口会出现异常。
将LIBPATH设置为/opt/freeware/lib/gcc/powerpc-ibm-aix6.1.0.0/4.2.0/pthread似乎可行,但其他非pthreaded程序将获取pthreaded lib,这可能会导致问题...
链接如下所示:
g++ -o omniNames -O2 -Wall -Wno-unused -fexceptions -Wl,-brtl -Wl,-blibpath:/lib:/usr/lib:/opt/dbx/omniORB-4/lib -L../../../lib -L../../../../lib omniNames.o NamingContext_i.o log.o omniNamesWin.o -lomniORB4-ar -lomnithread34 -lpthreads
我如何解决这个问题?
请注意,我尝试使用configure参数更改libpath,但没有成功。
答案 0 :(得分:2)
通过正确设置LIBPATH的包装器脚本启动可能是最简单的。
然后有ELF的RUNPATH / RPATH功能,允许在可执行文件中嵌入动态库的搜索路径;但我不知道AIX是否实现它。它使用与Linux和Solaris相同的参数设置,DT_RUNPATH设置为-Wl,--enable-new-dtags -Wl,-R$(RUNPATH)
,DT_RPATH设置为-Wl,--disable-new-dtags -Wl,-R$(RPATH)
;你可能只想测试-Wl,-R$(RPATH)
(可能会设置DT_RPATH)。
答案 1 :(得分:2)
每个操作系统都使用自己独特的一组环境变量来决定搜索共享库的位置。
大多数类UNIX系统都使用LD_LIBRARY_PATH
(但会有所不同)。
我发现找到要使用的环境变量的最有效方法是查看正在构建的平台上的dlopen()的手册页。
另请注意,这些变量的作用类似于PATH环境变量,因为它们是“:”分隔的路径列表。所以你不能这样设置环境:
# Using tcsh synttax for setting environemtn. Your shell may very.
setenv LIBPATH "/opt/freeware/lib/gcc/powerpc-ibm-aix6.1.0.0/4.2.0/:/opt/freeware/lib/gcc/powerpc-ibm-aix6.1.0.0/4.2.0/pthread"
答案 2 :(得分:1)
AIX ld
手册页指出:
Note: If you specify a shared object, or an archive file containing a
shared object, with an absolute or relative path name, instead of with
the -lName flag, the path name is included in the import file ID string
in the loader section of the output file. You can override this
behavior with the -bnoipath option.
因此,仅指定/my/path/to/libfoo.so而不是-lfoo
应该可以为您提供所需的行为。