聚合静态库
我尝试将多个.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
这有什么问题?
正如@Mat所说:
#ar x / * Repeat for all archives */ #ar cv
您正在将存档文件添加到存档文件中。 您不应该这样做,您应该将目标文件放在存档中。
如果您有GNU ar
,那么解决这个问题的方法是创建精简档案(使用T
开关):
GNU ar可以选择创建一个瘦存档,它包含一个符号索引和对存档成员文件的原始副本的引用。 这样的存档对于构建在本地构建中使用的库是有用的,其中可重定位对象应该保持可用,并且复制每个对象的内容只会浪费时间和空间。 精简归档也是扁平化的,因此将一个或多个归档添加到精简归档将单独添加嵌套归档的元素。 存档元素的路径相对于存档本身存储。
否则,归档包含原始.a
文件的所有单个.o
文件。