动态库编译及使用方法

参考文章

Linux GUN C程序观察 ——罗秋明 清华大学出版社

生成动态库

使用如下指令将addvec.c和multvec.c两个.c文件生成动态库libvector.so文件;

arm-linux-gnueabihf-gcc -shared -fPIC -o libvector.so addvec.c multvec.c 

$ file libvector.so 
libvector.so: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, BuildID[sha1]=e84b2b3243aa89861d2418af3e49f255aeb22870, with debug_info, not stripped
  • -shared 表示要生成动态库;
  • -fPIC 表示生成位置无关代码;

编译生成可执行程序

        接下来在编译生成可执行程序的时候使用动态库,编译的时候使用了动态库libvector.so并且制定了依赖的头文件路径为include目录下;

arm-linux-gnueabihf-gcc -o main-lib-shared main-lib.c libvector.so -I./include
  • -I./include 表示添加头文件搜索路径include;

        或者也可以使用如下指令生成main-lib可执行文件;

arm-linux-gnueabihf-gcc -o main-lib-shared main-lib.c -I./include -L./ -lvector

$ file main-lib-shared 
main-lib-shared: 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]=86acff7797a806d3f8457792709e7d11c137c752, with debug_info, not stripped
  • -L./ 表示libvector.so库所在目录为当前目录;
  • -l 表示引用libvector.so库;

运行可执行文件main-lib-shared

        如果直接运行会报错找不到动态库libvector.so,此时需要高速运行环境从哪里载入动态库文件,可以使用LD_LIBRARY_PATH环境变量来指定。

/nfs # ./main-lib-shared
./main-lib-shared: error while loading shared libraries: libvector.so: cannot open shared object file: No such file or directory

        此时需要先指令libvector.so库的载入目录,然后在执行main-lib-shared可执行文件即可;

/ # export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/nfs
/ # /nfs/main-lib-shared
z = [4 6]

示例代码

// include/vector.h
void addvec(int *x, int *y, int *z, int n);
void multvec(int *x, int *y, int *z, int n);

// 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值