静态库的共享对象访问变量,变量互不相同

问题描述

我创建的 libxa.a 有一个变量(int p)和一个增加 p 的函数(void increase())。
共享对象(libxb.so 和 libxc.so)每个都有调用 void increase() 的函数(void b() 和 c())。
主要调用 void b() 和 void c()。

main --+-- libxb.so --+-- libxa.a  
       |              |
       +-- libxc.so --+

调用 void b() 和我想的一样有效。
但 void c() 不是。我以为打印了 14 和 15,但打印了 12 和 13 就像 void b()。

我认为从共享对象访问的变量(int p)彼此不同。
我该如何解决

以下是来源。

// a.h
void increase();

// a.c
#include <stdio.h>
#include "a.h"

int p = 11;

void increase()
{
    p++;
    printf("===[%i]===\n",p);
}

// b.h
void b(void);

// b.c
#include <stdio.h>
#include "b.h"
#include "a.h"

void b(void)
{
    increase();
}

// c.h
void c(void);

// c.c
#include <stdio.h>
#include "c.h"
#include "a.h"

void c(void)
{
    increase();
}

// main.c
#include <stdio.h>
#include <dlfcn.h>
#include "b.h"
#include "c.h"

int main()
{
    void(*b)(void);
    void* lb = dlopen("./libxb.so",RTLD_Now);
    b = (void(*)(void))dlsym(lb,"b");
    void(*c)(void);
    void* lc = dlopen("./libxc.so",RTLD_Now);
    c = (void(*)(void))dlsym(lc,"c");

    b();  // ===[12]===
    b();  // ===[13]===
    c();  // NOT ===[14]=== BUT ===[12]===
    c();  // NOT ===[15]=== BUT ===[13]===
}

// CMakeLists.txt
cmake_minimum_required (VERSION 3.8)
project ("Test")

add_library(xa STATIC a.c)
set_property(TARGET xa PROPERTY POSITION_INDEPENDENT_CODE TRUE)
add_library(xb SHARED b.c)
add_library(xc SHARED c.c)

target_link_libraries(xb xa)
target_link_libraries(xc xa)

add_executable(xm main.c)
target_link_libraries(xm dl)

提前感谢您的关注。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)