首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态库动态附加

动态库动态附加
EN

Stack Overflow用户
提问于 2015-11-13 14:57:16
回答 1查看 66关注 0票数 0

编辑发现了一个问题,但它仍然需要解决,它应该在下面的答案我的任务是编写应用程序的基础上,现有的文件。Test.c(主)rangapi.c随机api.h(这里有两个函数)和initapi.c(一个函数)。“如何使用动态库作为动态加载库。使用eg9 (我创建了一个动态库,它运行得很好)编写了一个应用程序,这个库将被附加到动态库中。”

下面是我对makefile的尝试,但是终端说:当我使用./Program来运行文件时,未能打开

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

代码语言:javascript
复制
#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
EN

回答 1

Stack Overflow用户

发布于 2015-11-13 15:02:49

看看man 3 dlopen中的这一行

如果文件名包含斜杠("/"),那么它将被解释为(相对或绝对)路径名称。否则,动态链接器将按如下方式搜索对象(更多详细信息,请参见ld.so(8) ):

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

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

如果是这样的话,解决办法很简单:

代码语言:javascript
复制
lib=dlopen("./librandapi.so", RTLD_LAZY);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33695554

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档