AIX上的GCC问题

时间:2014-08-20 06:54:15

标签: gcc compiler-construction aix

我正在AIX上使用GCC构建我的C程序。在构建它时,我指的是那些在AIX上使用XLC进行编译和构建的库。我的图书馆位置有两种形式,即同一个图书馆以* .so和* .a的形式出现。但是当构建我的应用程序时,它静态链接到* .a库而不是* .so并且在动态加载库时它引用* .so是否有任何方法来控制它,以便我的库的静态和动态链接只发生在*。一个。

P.S我无法从库位置删除* .so库。

我使用的命令如下:

$(PRODUCT)/ lib包含在AIX上使用XLC构建的库(* .a,*。so)

CC = / usr / bin / gcc -maix64

DynamicInboxLibGcc:

$(CC) -o InboxLib.o -I$(PRODUCT)/include -I. -L$(PRODUCT)/lib -fPIC -c InboxLib.c $(LIBS)   
$(CC) InboxLib.o -I$(PRODUCT)/include -ar -shared -o $(PRODUCT)/libInboxLibXlc.a -L$(PRODUCT)/lib $(LIBS)

WrapperLibGcc:

$(CC) -o DynamicLinkSample.o -I$(PRODUCT)/include -I. -L$(PRODUCT)/lib -qPIC -c DynamicLinkSample.c $(LIBS)
$(CC) DynamicLinkSample.o -I$(PRODUCT)/include -ar -shared -o $(PRODUCT)/CustomLib.a -L$(PRODUCT)/lib $(LIBS)

DynamicMainProgramGcc:

$(CC) -o DynamicMainProgram -wl -brtl MainProgram.c -Wall -fPIC -I$(PRODUCT)/include -I. -L/usr/lib/threadsi -L$(PRODUCT)/lib $(LIB_PATH)/CustomLib.a $(LIB_PATH)/libInboxLibXlc.a -ldl $(LIBS)

2 个答案:

答案 0 :(得分:0)

  • 尝试在AIX上执行truss并检查链接器是如何从gcc执行的(以及IBM的版本或GNU')
  • 尝试手动执行ld以链接二进制文件
  • 尝试将变量$(LIBS)拆分为静态变量和动态变量。它们是从gcc传递到链接器的参数。
  • 如果您使用的是gnu ld,那么您可以使用类似gcc <objectfiles> -Wl,-Bstatic -lstatic1 -lstatic2 -Wl,-Bdynamic -ldynamic1 -ldynamic2之类的内容。选项-Wl表示(将以下参数传递给链接器)。 -Bstatic-BDynamic是GNU链接器的参数。如果你不使用它们,gcc可能会推断它自己的链接器参数。但也许它以某种方式失败了。特别是当IBM的链接器使用不同的参数时。

PS:我会在GNU之前推荐AIX ld。

PS1:在AIX上忽略-fPIC

答案 1 :(得分:0)

GNU Binutils在AIX上无法正常运行。必须使用AIX汇编程序和链接器。

默认情况下,AIX链接优先使用.a扩展名扩展.so文件扩展名。

AIX的命名方案与SVR4 / Linux不同。通常,AIX共享对象是归档库的成员,例如libfoo.a(shr.o),这意味着共享对象(传统上称为shr.o)是libfoo.a的归档成员。一个通常没有静态存档,或者至少是静态对象的单独存档。是的,这与大多数软件包的构建和安装的默认方式相冲突。

可以使用-brtl链接器选项优先选择.so文件扩展名,但这会产生其他问题,因为它会为应用程序准备运行时链接,这意味着在运行时覆盖符号。此功能在运行时非常昂贵。

最好不要使用具有.a和.so文件扩展名版本的同名库。如果想要动态链接,只需在库搜索路径目录中提供库的动态版本(.so或.a)。