【发布时间】:2014-10-13 10:38:32
【问题描述】:
我正在 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)
【问题讨论】:
-
请给出您用于构建程序的确切命令,否则您的问题不清楚。
-
您不能动态加载静态库 (*.a)。如果您仍有问题,请向我们展示您用于链接的命令行。
-
不知道你对AIX有多熟悉。因此,您可能会发现此评论离题。但无论如何:AIX - 与其他 Unix 不同 - 不使用可执行格式 .ELF,而是使用它自己的称为 XCOFF 的格式。这种格式也支持静态库和动态库,但是静态与动态的含义略有不同。例如,所有 PowerPC 代码都是“自然”位置独立的,这使人们认为 AIX 上的静态库和动态库之间没有区别。 XCOFF 格式还支持单个文件中的 32 位和 64 位符号。
-
您使用的是 CMAKE 还是 Automake 工具?您正在构建“共享”库,但您希望它具有后缀 .a? DynamicInboxLibGc:~-shared -o $(PRODUCT)/libInboxLibXlc.a~。我记得 GNU Linker(ld) 存在一些问题。在 AIX 上使用 gcc 时,最好使用 OS 提供的链接器。尝试拆分步骤并尝试分别调用步骤。
-
不,我没有使用 CMAKE,我使用的是 make。我关心的不是我正在构建的共享库。我所指的库位于 $(PRODUCT)/lib 中。在这里,我有与 *.a 和 *.so 相同的库,这导致了问题
标签: gcc compiler-construction aix