gpt4 book ai didi

c++ - 在共享库和 main 之间共享全局数据

转载 作者:太空宇宙 更新时间:2023-11-04 02:58:16 25 4
gpt4 key购买 nike

我有一个名为 global_count 的变量,我想在共享库和程序的主要部分(以及最终的其他库,但现在我已经简化了测试用例)之间共享它。

鉴于 globals.cpp 中 global_count 的声明:

extern "C" {
int* global_count;
}

我们编译创建一个 global.o 文件:

gcc -c global.cpp

下面的 shared.cpp 将用于创建 shared.so:

#include <stdio.h>
#include "global.h"

extern "C" {


void init_global_count(int* xp) {
printf("Initialize global count to: %d\n", *xp);
global_count = xp;
};

void print_global_count(){
if(global_count) {
printf("global_count is: %d\n",*global_count);
} else {
printf("global_count* is not initialized!\n");
}
};
}

全局.h:

extern "C" {
extern int* global_count;
}

主要.cpp:

#include <stdlib.h>
#include <dlfcn.h>
#include <stdio.h>
#include "global.h"

int answer = 42;
int* gc_copy;

typedef void (*func)();
void (*init_global_count)(int*);
void (*print_global_count)();

void load(char* shared_lib){
void* handle;
handle = dlopen(shared_lib,RTLD_NOW | RTLD_GLOBAL) ;
printf("load:after dlopen\n");
if(!handle)
{
printf("DID NOT LOAD!\n");
fflush(stdout);
fputs (dlerror(), stderr);
exit(1);
} else {
printf("Loaded OK!\n");
fflush(stdout);

void (*init_global_count)(int*) = (void (*)(int*))dlsym(handle, "init_global_count");
(*init_global_count)(&answer);
void (*print_global_count)() = (void (*)())dlsym(handle, "print_global_count");
(*print_global_count)();
}
}

int main(){
printf("main...\n");
load((char*)"./shared.so");
if(global_count)
printf("main:global_count is: %d\n", *global_count);
return 0;
}

编译共享库和主程序:

gcc -g -Wall -fno-omit-frame-pointer -fPIC -shared -o shared.so shared.cpp global.o
gcc -g -o main main.cpp global.o -ldl

请注意,我们在这两个编译中都在 global.o 中进行了链接。

现在我们运行它,输出是:

main...
load:after dlopen
Loaded OK!
Initialize global count to: 42
global_count is: 42

因此,*print_global_count()*(在 shared.cpp 中定义)内部报告的 *global_count* 是预期的 42。然而,global_count 并未从 main 中报告,因为 global_count 指针尚未初始化 - 因此 main.cpp 中的 global_count 与 shared.cpp 中的 global_count 不同。

我想知道是否可以做我在这里想做的事情(在 .so 和加载 .so 的模块之间共享一些全局数据)?如果是这样,我需要以不同的方式链接吗?

最佳答案

共享库中的所有对象都需要编译为位置无关(-fpic-fPIC)。所以链接在globals.o进入您的共享库是错误的。

您实际上是在创建 global_count 的两个实例指针。您正在尝试从 main 打印出一个指针值作为十进制整数.全局指针变量 global_countmain version 尚未初始化,因此所有字节的起始值都设置为 0 .

您可以删除 globals.o来自您的共享库,并且只有一个 global_count 的实例主变量。但是,对于共享库看main全局变量,它们必须对它们可见。您可以通过添加 -rdynamic 来完成此操作到标志 gcc在您的 main 链接行中.

关于c++ - 在共享库和 main 之间共享全局数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15008599/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com