簡體   English   中英

傳遞給共享庫函數時,變量沒有相同的值

[英]Variables do not have the same value when passed into shared library functions

我已經開發了一些功能,這些功能需要集成到已經存在的C代碼中以更新其功能。 為了使調用新函數盡可能簡單,我定義了一個容器結構,該容器結構包含我需要的所有Poiners和數據。

typedef struct parameters
{
    double time;
    int num_sp;
    int num_nodes;
    int dielCount;
    double meshbounds[6];
} Params;

typedef struct FGM_Container
{
    dev_nodes *d_nodes;
    dev_nodes *h_nodes;
    dev_species *d_sp;
    dp_tree *octree;
    dp_params *dp_pars;
    dev_params *d_p;
    Params           p;     /* Parameters */
    Nodes           *n;     /* nodes array */
    int free_dev_flag;
    double guard_range;
    int max_octree_depth;
} fgm_container;

我將函數編譯到一個名為FGM的共享庫中(.so,因為我在Linux上工作),提供了帶有標頭的標頭,這些標頭包含要從原始代碼調用的函數,並成功地重建了整個項目。 但是,當執行進入我的函數時,似乎傳遞給它們的變量不會保留相同的值。 這是一個非常簡單的示例,之前和之后的代碼更加復雜,但這代表了我正在觀察的行為:

int fgm_init(fgm_container *fgmc, int verbose);


int main()
{
    int fgm_ok = 0;
    int free_dev_flag;
    double guard_range = 0;
    int max_octree_depth = 5;

    Params p;
    fgm_container fgmc;

    //Set parameters
    p.time = 0;
    p.num_sp = 2;
    p.num_nodes = 500;
    p.dielCount = 1;
    p.meshbounds[0] = -0.019;
    p.meshbounds[1] =  0.0475;
    p.meshbounds[2] = -0.045;
    p.meshbounds[3] =  0.032;
    p.meshbounds[4] = -0.027;
    p.meshbounds[5] =  0.010;

    //Fill FGM container
    fgmc.p = p;
    fgmc.guard_range = guard_range;
    fgmc.max_octree_depth = max_octree_depth;

    //Print original data
    printf("Original data:\n");
    printf("dielCount: %d\n", fgmc.p.dielCount);
    printf("species: %d\n", fgmc.p.num_sp);
    printf("meshb: %lf %lf\n", fgmc.p.meshbounds[0], fgmc.p.meshbounds[1]);


    //Initialize FGM library
    fgm_ok = fgm_init(&fgmc, 2);

    if (fgm_ok != 0)
    {
        printf("FGM initialization failed. Exiting.\n");
        exit(-1);
    }

    return 0;
}


int fgm_init(fgm_container *fgmc, int verbose)
{
    int ok_flag=0;

    //Extract data from FGM container
    Params p = fgmc->p;
    double guard_range = fgmc->guard_range;
    int max_octree_depth = fgmc->max_octree_depth;


    if (verbose > 0) printf("FGM: Initializing...\n");
    printf("species: %d\n", p.num_sp);
    printf("meshb: %lf %lf\n", p.meshbounds[0], p.meshbounds[1]);
    printf("dielCount: %d\n", p.dielCount);
    getchar();  


    //Proceed with other initialization steps...

    return ok_flag;
}

此代碼在我的屏幕上輸出

Original data:
dielCount: 1
species: 2
meshb: -0.019000 0.047500

FGM: Initializing...
dielCount: 28203712
species: 2
meshb: 0.000000 0.000000
dielcount: 28203712

每次啟動代碼時, dielCount值都會更改,就好像它是未初始化的變量一樣。 由於在各種malloc函數中使用了各種參數,因此事情很快就變得一發不可收拾,而且我開始擺脫內存錯誤等問題。 而且,如果我嘗試通過值將參數結構本身傳遞給初始化函數,也將得到相同的結果,即:

int fgm_init(fgm_container *fgmc, Params p, int verbose);


int main()
{
    // Same steps as before...

    //Initialize FGM library
    fgm_ok = fgm_init(&fgmc, p, 2);

    if (fgm_ok != 0)
    {
        printf("FGM initialization failed. Exiting.\n");
        exit(-1);
    }

    return 0;
}


int fgm_init(fgm_container *fgmc, Params p, int verbose)
{
    int ok_flag=0;

    if (verbose > 0) printf("FGM: Initializing...\n");
    printf("species: %d\n", p.num_sp);
    printf("meshb: %lf %lf\n", p.meshbounds[0], p.meshbounds[1]);
    printf("dielCount: %d\n", p.dielCount);
    getchar();  


    //Proceed with other initialization steps...

    return ok_flag;
}

我想指出的是,在將共享庫集成到目標項目(相當大)之前,已通過單獨但很小的測試驗證了共享庫是否可以正確執行。

這個錯誤讓我忙了好幾個小時,試圖找出答案,很明顯我缺少了一些東西。 關於共享庫的工作我應該了解什么,因為這是我第一次創建共享庫? 這可能與編譯有關,因為原始項目是使用C編譯器編譯的,而我的庫是使用NVIDIA NVCC編譯器編譯的(因為我也使用了一些CUDA調用,但它們出在麻煩的部分之后),這是C ++編譯器,用於主機代碼部分? 感謝您提供的任何見解。

您是否檢查了.so文件中的符號(使用nm或類似文件)? 名稱可能被C ++編譯器所破壞,從而導致應用程序中發生奇怪的事情。

在您的結構周圍添加extern "C"可能會解決您的問題。 例如:

extern "C" {
    typedef struct parameters
    {
        double time;
        int num_sp;
        int num_nodes;
        int dielCount;
        double meshbounds[6];
    } Params;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM