EDIT发现了一个问题,但仍需要解决它应该在答案中 我的任务是根据现有文件编写应用程序。 test.c(main)randapi.c randapi.h(这里有2个函数)和initapi.c(一个函数)。 “你如何使用动态库作为动态加载库。使用eg9(我创建了一个动态库,它工作正常)编写应用程序,这个库将附加动态”
这是我尝试使用makefile但是终端说:当我使用./program来运行文件时无法打开
我试过版本而没有附加initapi.c但是它说initRand是未知的,除了make文件清楚地附加它
#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
答案 0 :(得分:0)
在man 3 dlopen
中查看此行:
如果filename包含斜杠(&#34; /&#34;),则将其解释为(相对或绝对)路径名。否则,动态链接器将按如下方式搜索对象(有关详细信息,请参阅ld.so(8)):
(然后是一系列规则,不包括当前目录,也不包括可执行文件所在的目录)。
我的猜测是您正在将librandapi.so
复制到当前目录,这就是为什么dlopen()
无法找到它。
如果是这样,解决方案很简单:
lib=dlopen("./librandapi.so", RTLD_LAZY);