【问题标题】:Dynamic library dynamic attach动态库动态附加
【发布时间】:2015-11-13 14:57:16
【问题描述】:

EDIT 发现了一个问题,但仍需要解决它应该在答案下方 我的任务是根据现有文件编写应用程序。 test.c(main) randapi.c randapi.h(这里有2个函数)和initapi.c(一个函数)。 “您如何将动态库用作动态加载的库。使用 eg9(我制作了一个动态库并且效果很好)编写应用程序,该库将动态附加”

这是我对 makefile 的尝试,但终端显示:当我使用 ./program 运行文件时无法打开

我也试过不附加 initapi.c 的版本,但它说 initRand 是未知的,除了使文件清楚地附加它

#include <stdio.h>
#include <dlfcn.h>
#include <stdlib.h>
#define ITERATIONS  1000000L

int main(int argc, char** argv)
{
  long  i;
  long  isum;
  float fsum;
  void *lib;

  lib=dlopen("librandapi.so", RTLD_LAZY); 
  if (!lib)
  {
    printf("failed to open");
    exit(1);
  }
  int (*getRand)(int);
  float (*getSRand)();
  void (*initRand)();

getRand=dlsym(lib,"getRand");
getSRand=dlsym(lib,"getSRand");
initRand=dlsym(lib,"initRand");

  initRand();
  isum = 0L;
  for (i = 0 ; i < ITERATIONS ; i++) {
    isum += ((*getRand)(10));
  }
  printf( "getRand() Average %d\n", (int)(isum / ITERATIONS) );

  fsum = 0.0;
  for (i = 0 ; i < ITERATIONS ; i++) {
    fsum += ((*getSRand)());
  }

  printf( "getSRand() Average %f\n", (fsum / (float)ITERATIONS) );
  dlclose(lib);
  return 0;
}
//////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////
makefile

  zad9: test.c
    gcc -Wall -o zad9 test.c -ldl
librandapi.so: randapi.o initapi.o
    gcc -shared -o librandapi.so randapi.o initapi.o
randapi.o: randapi.c randapi.h
    gcc -c -Wall -fPIC randapi.c
initapi.o: initapi.c
    gcc -c -Wall -fPIC initapi.c

//////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////

   zad9: test.c initapi.c
    gcc -Wall -o zad9 test.c initapi.c -ldl
librandapi.so: randapi.o initapi.o
    gcc -shared -o librandapi.so randapi.o 
randapi.o: randapi.c randapi.h
    gcc -c -Wall -fPIC randapi.c

【问题讨论】:

  • errno中的值是什么,最好是strerror()翻译,在dlopen()之后?

标签: c linux makefile


【解决方案1】:

man 3 dlopen中的这一行:

如果文件名包含斜杠(“/”),则将其解释为(相对或绝对)路径名。否则,动态链接器会按如下方式搜索对象(有关详细信息,请参阅 ld.so(8)):

(然后是一堆不包括当前目录和可执行文件所在目录的规则)。

我的猜测是您将librandapi.so 复制到当前目录,这就是dlopen() 找不到它的原因。

如果是这样,解决方法很简单:

lib=dlopen("./librandapi.so", RTLD_LAZY);

【讨论】:

  • 所有文件都在一个文件夹中,但我试过了,没用
  • @RafałBolek:您是从其目录运行程序 (./program) 还是从另一个目录运行程序 (src/bin/program)?因为如果你做后者,所以不会被找到,你需要"src/bin/librandapi.so"
  • @rodrigoi:我从它的目录中执行此操作,我发现了一个问题,当我将 makefile 分开时,它突然可以完美运行 meab 你知道将它们拉到一个保持良好结果的方法吗?跨度>
猜你喜欢
  • 2021-03-03
  • 1970-01-01
  • 1970-01-01
  • 2022-12-20
  • 2019-12-20
  • 1970-01-01
  • 1970-01-01
  • 2012-02-26
  • 2011-04-06
相关资源
最近更新 更多