2015-11-13 60 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您知道如何將它們拉入保持良好結果的方式嗎? –