我正在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)
答案 0 :(得分:0)
$(LIBS)
拆分为静态变量和动态变量。它们是从gcc传递到链接器的参数。 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)。