聚合静态库

时间:2012-03-03 14:56:45

标签: c static-libraries

我尝试将多个.a文件聚合为一个文件。该命令如下:

TARGET=libnumpy.a
DIR=build/lib.linux-x86_64-2.6/numpy
FILES=$(DIR)/core/_sort.a $(DIR)/core/multiarray.a $(DIR)/core/umath.a $(DIR)/core/scalarmath.a $(DIR)/core/umath_tests.a $(DIR)/core/multiarray_tests.a $(DIR)/lib/_compiled_base.a $(DIR)/numarray/_capi.a $(DIR)/fft/fftpack_lite.a $(DIR)/linalg/lapack_lite.a $(DIR)/random/mtrand.a

all:
    ar cr $(TARGET) $(FILES)

但是生成的库libnumpy.a无法使用。当试图用它编译一些东西时,我得到了

libnumpy.a: could not read symbols: Archive has no index; run ranlib to add one

(我试图运行ranlib,但它没有解决问题)

当做nm libnumpy.a时,我得到了

nm: _sort.a: File format not recognized
nm: multiarray.a: File format not recognized
nm: umath.a: File format not recognized 
nm: scalarmath.a: File format not recognized
nm: umath_tests.a: File format not recognized
nm: multiarray_tests.a: File format not recognized
nm: _compiled_base.a: File format not recognized
nm: _capi.a: File format not recognized
nm: fftpack_lite.a: File format not recognized
nm: lapack_lite.a: File format not recognized
nm: mtrand.a: File format not recognized

这有什么问题?

2 个答案:

答案 0 :(得分:4)

您正在将存档文件添加到存档文件中。您不应该这样做,您应该将目标文件放在存档中。

如果您拥有GNU ar,那么就可以创建精简档案(使用T开关):

  

GNU ar可以选择创建一个瘦存档,其中包含符号索引和对成员原始副本的引用          档案的档案。这样的存档对于构建库以便在可重定位的本地构建中使用非常有用          期望对象保持可用,并且复制每个对象的内容只会浪费时间和空间。的薄          归档也是扁平化的,因此将一个或多个归档添加到精简归档将添加嵌套归档的元素          单独存储。存档元素的路径相对于存档本身存储。

否则,请归档构成原始.o文件的所有单个.a文件。

答案 1 :(得分:2)

正如@Mat所说:

#ar x <archivefile>  / * Repeat for all archives */
#ar cv <all Obj fiels>