再探动态库的应用

代码:

//file:addVec.c

#include "vector.h"                                                                       

int gVal = 200;        //变量的定义与初始化,在大他区域
int gVal2 = 1;         //变量的定义,在bss区域
int addVec(int *xP, int *yP, int *zP, int Num){ 
  for(int i = 0; i < Num; i++){
    zP[i]
= xP[i] + yP[i];
  }
gVal
+= Num;

return gVal + gVal2;
}

//vector.h
#ifndef vector_h
#define vector_h
int addVec(int *xP, int *yP, int *zP, int Num);
void mulVec(int *xP, int *yP, int *zP, int Num);
#endif

//mulVector.c
#include "vector.h"
void mulVec(int *xP, int *yP, int *zP, int Num){
  for(int i = 0; i < Num; i++){
    zP[i]
= xP[i] * yP[i];
  }

return;
}

//testVec.c
#include <stdio.h>
#include
"vector.h"
int x[2] = {1, 2};
int y[2] = {3, 4};
int z[2];

extern int gVal;           //变量的声明,只能一次定义,可以多次声明
extern int gVal2;           //声明一个变量,在其他地方定义的变量

int main(int argc, char **argv)
{
  addVec(x, y, z,
2);
  printf(
"z = [%d %d]\n", z[0], z[1]);

  return gVal + gVal2;
}

编译动态库:gcc -shared -fPIC -o libVector.so addVec.c mulVec.c

用动态库编译:gcc -g -I. -L. -lVector testVec.o -o testVec

修改变量:LD_LIBRARY_PATH

  LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PWD/.

  echo $LD_LIBRARY_PATH  结果::/home/nication/WORKM/studyCode/gnuC/chapter04/lib/shared2/. 没有问题

  export LD_LIBRARY_PATH

执行:./testVec

结果:z = [4 6]

查看返回变量:echo  $? 值为203 正常OK

后续,需要调试时,总是出现断点无法设置在动态库内的情况,在gdb启动后,使用catch load 库名,载入库文件
具体为:

  先catch load libVector.so载入库

  再设置断点

  然后进入库中的函数就可以普通调试

 在其他文件中定义的变量,如果需要在另外一个文件中使用时,必须加上extern表明为二次声明

  

posted @ 2020-12-28 16:59  叕叒双又  阅读(100)  评论(0编辑  收藏  举报