编译静态库的方法
- 将.c文件编译为.o文件,指令如下:
arm-linux-gnueabihf-gcc -Og -c addvec.c multvec.c
$ file addvec.o multvec.o
addvec.o: ELF 32-bit LSB relocatable, ARM, EABI5 version 1 (SYSV), not stripped
multvec.o: ELF 32-bit LSB relocatable, ARM, EABI5 version 1 (SYSV), not stripped
执行完之后会生成两个可重定位目标文件(relocatable);
- 将.o文件存档为.a文件,指令如下:
arm-linux-gnueabihf-ar -rcs libvector.a addvec.o multvec.o
file libvector.a
libvector.a: current ar archive
- 使用ar -t可以看到libvector.a库依赖两个.o文件addvec.o和multvec.o文件;
arm-linux-gnueabihf-ar -t libvector.a
addvec.o
multvec.o
使用.a库编译生成可执行文件
- 指令如下,main-lib.c文件中包含main函数,-o表示生成可执行文件main-lib,-I表示指定头文件路径为include。
arm-linux-gnueabihf-gcc main-lib.c libvector.a -o main-lib -I./include
执行为该指令之后就会生成main-lib这个可执行文件,放在开发板上就可以执行的。
file main-lib
main-lib: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 2.6.31, BuildID[sha1]=95b17dbcc1e9a2482087c56d33b242165578c8a4, with debug_info, not stripped
如下指令可以对.o文件和可执行文件进行反汇编;
arm-linux-gnueabihf-objdump -d addvec.o
实例代码如下:
addvec.c
void addvec(int *x, int *y, int *z, int n)
{
int i;
for (i = 0; i < n; i++)
{
z[i] = x[i] + y[i];
}
}
multvec.c
void multvec(int *x, int *y, int *z, int n)
{
int i;
for (i = 0; i < 0; i++)
{
z[i] = x[i] * y[i];
}
}
main-lib.c
#include <stdio.h>
#include "vector.h"
int x[2] = {1, 2};
int y[2] = {3, 4};
int z[2];
int main()
{
addvec(x, y, z, 2);
printf("z = [%d %d]\n", z[0], z[1]);
return 0;
}
include/vector.h
void addvec(int *x, int *y, int *z, int n);
void multvec(int *x, int *y, int *z, int n);
参考文章
Linux GUN C程序观察 ——罗秋明 清华大学出版社