2015-11-13 59 views
0

编辑发现了一个问题,但它仍然需要解决它应该在下面的答案 我的任务是编写基于现有文件的应用程序。 test.c(main)randapi.c randapi.h(这里有两个函数)和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 
+0

什么在'errno',价值preferrably用'字符串错误翻译()',后'dlopen的()'? –

回答

0

看看man 3 dlopen这一行:

如果文件名包含斜杠(“/”),则它被解释为(相对或绝对)路径名。否则,该对象的动态链接程序搜索如下(见ld.so(8),用于进一步的细节):

(然后一个规则布赫不包括当前目录也不是一个,其中所述可执行是)。

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

如果是这样的情况下,解决方案很简单:

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

所有文件都在一个文件夹中,但我试过了,没有工作 –

+0

@RafałBolek:你是从其目录('。/ program')运行程序还是从另一个目录运行程序('src/bin/program' )?因为如果你使用后者,将不会找到,你需要''src/bin/librandapi.so“'。 – rodrigo

+0

@rodrigoi:从目录中执行此操作,我发现了一个问题,当我将makefile与它分开时,它突然发挥作用完美meab您知道如何将它们拉入保持良好结果的方式吗? –