如何通过静态库(macOS)在主进程和动态库之间共享全局变量?

问题描述 投票:1回答:1

我的问题似乎与此问题相似,但是在我的情况下,共享变量位于静态库中,而且该问题的建议也无济于事:Sharing global data between a shared library and main。一路上,我看到了这个问题带来的问题,但也没有最终解决方案:OS X linker unable to find symbols from a C file which only contains variables

我正在尝试使我的主进程和一个动态库dlopen共享全局变量SHARED,该全局变量位于它们都链接到的共享库中。

我创建了一个minimal project on GitHub,但我还在下面提供了该项目的内容。

问题:我期望的输出是在两种情况下都看到相同的变量和相同的地址。相反,我看到了SHARED变量的两个副本。

我的问题:哪种编译和链接标志组合可以删除SHARED变量的第二个实例,以便在主进程和动态库之间只能正确共享一个实例。

输出

Hello, World!
SHARED: 0x104970030 123
SHARED: 0x104988018 (null)

Process finished with exit code 0

main.c

#include "dynamic_lib.h"

#include <assert.h>
#include <dlfcn.h>
#include <stdio.h>

extern char *SHARED;

int main() {
  printf("Hello, World!\n");

  SHARED = "123";
  printf("SHARED: %p %s\n", &SHARED, SHARED);

  void *handle = dlopen("libdynamic_lib.dylib", RTLD_NOW | RTLD_GLOBAL);
  assert(handle != NULL);

  void *sym = dlsym(handle, "dynamic_lib_func");
  assert(sym != NULL);

  ((void (*)(void))sym)();

  return 0;
}

dynamic_lib.c

#include "dynamic_lib.h"

#include "static_lib.h"

#include <stdio.h>

void dynamic_lib_func() {
  printf("SHARED: %p %s\n", &SHARED, SHARED);
}

static_lib.c

#include "static_lib.h"

char *SHARED; // adding = 0 doesn't change much

CMakeLists.txt

cmake_minimum_required(VERSION 3.13)
project(untitled1 C)

set(CMAKE_C_STANDARD 99)

add_library(static_lib STATIC static_lib.c)
add_library(dynamic_lib SHARED dynamic_lib.c)

target_link_libraries(dynamic_lib static_lib)

add_executable(untitled1 main.c)
target_link_libraries(untitled1 static_lib)

add_dependencies(untitled1 dynamic_lib)
c linker dynamic-library
1个回答
0
投票

都是您的主要可执行文件,并且动态库链接在static_lib.c中。因此,您将有两个char *SHARED;实例。如果动态库中的函数将使用其自己的实例,或者将其用于主要可执行文件,我想这将取决于实现。就您而言,它似乎使用了自己的。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.