AIX上的GCC问题

AIX上的GCC问题,gcc,compiler-construction,aix,Gcc,Compiler Construction,Aix,我正在AIX上使用GCC构建我的C程序。在构建它时,我指的是一些在AIX上使用XLC编译和构建的库。我的库位置有两种形式,即同一个库以*.so和*.a的形式存在。但是,在构建应用程序时,它会静态链接到*.a库而不是*.so,在动态加载库时,它会引用*.so。因此,是否有任何方法可以控制这一点,以便我的库的静态和动态链接只发生在*.a 另外,我无法从库位置删除*.so libs 我使用的命令如下: $(PRODUCT)/lib包含在AIX上使用XLC构建的库(*.a,*.so) CC=/usr/b

我正在AIX上使用GCC构建我的C程序。在构建它时,我指的是一些在AIX上使用XLC编译和构建的库。我的库位置有两种形式,即同一个库以*.so和*.a的形式存在。但是,在构建应用程序时,它会静态链接到*.a库而不是*.so,在动态加载库时,它会引用*.so。因此,是否有任何方法可以控制这一点,以便我的库的静态和动态链接只发生在*.a

另外,我无法从库位置删除*.so libs

我使用的命令如下:

$(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)
包装器libgcc:

$(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)
动态程序GCC:

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


PS1:-fPIC在AIX上被忽略

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)。

请给出用于构建程序的确切命令,否则您的问题不清楚。您无法动态加载静态库(*.a)。如果您仍然有问题,请向我们展示用于链接的命令行。我不知道您对AIX有多熟悉。所以你可能会发现这个评论离题了。但是无论如何:AIX—与其他Unix相反—不使用可执行文件格式.ELF,而是使用自己的名为XCOFF的格式。此格式还支持静态和动态库,但静态和动态库的含义略有不同。例如,所有PowerPC代码都是位置独立的,这使得人们认为AIX上的静态库和动态库没有区别。XCOFF格式还支持单个文件中的32位和64位符号。您使用的是CMAKE还是Automake工具?您正在构建“共享”库,但希望它具有后缀。a?DynamicInboxLibGc:~-shared-o$(PRODUCT)/libInboxLibXlc.a~。我记得GNU链接器(ld)有一些问题。在AIX上使用gcc时,最好使用OS提供的链接器。尝试拆分步骤并尝试分别调用步骤。不,我没有使用CMAKE,我使用的是make。我关心的不是我正在建设的共享图书馆。我所指的库位于$(PRODUCT)/lib。这里我有一个与*.a和*.a相同的库,这导致了这个问题,问题是我所指的库是第三方库,它们的名称将来可能会更改,这就是为什么我不想通过指定它们的名称直接链接它们。有什么方法可以强制链接器只链接*.a库吗?很可能是的。但首先,您必须知道您使用的是GNU的binutils中的
ld
,还是IBM(AIX)提供的
ld
。当您执行gcc时,它将只编译源代码。它不会执行任何链接。相反,它将在后台以静默方式执行
ld
。您必须知道执行了哪个
ld
,以及向其传递了哪些参数。然后检查特定链接器的文档。两个链接器的许多参数都是相同的,但是当谈到细节时,您必须知道您使用的是哪个链接器。