静态库编译及使用方法

编译静态库的方法

  1. 将.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);

  1. 将.o文件存档为.a文件,指令如下:
    arm-linux-gnueabihf-ar -rcs libvector.a addvec.o multvec.o
file libvector.a       
libvector.a: current ar archive
  1. 使用ar -t可以看到libvector.a库依赖两个.o文件addvec.o和multvec.o文件;
arm-linux-gnueabihf-ar -t libvector.a                      
addvec.o
multvec.o

使用.a库编译生成可执行文件

  1. 指令如下,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程序观察 ——罗秋明 清华大学出版社

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值