![](/img/trans.png)
[英]How can Qt containers be passed as parameters to functions of a shared library?
[英]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.