可执行文件中静态成员(在共享库中定义)的单独副本

Separate copy of static member(defined in a shared library) inside executable

提问人:Vivek Mangal 提问时间:2/10/2023 最后编辑:Vivek Mangal 更新时间:2/10/2023 访问量:30

问:

我正在我的 Mac 系统上构建一个项目。我有链接到Mac框架()的静态库。我正在与我的可执行文件动态链接。C++libA.aB.frameworkB.frameworkexe

在 中定义的类中定义了一个成员staticlibA.a

class MyClass {
    static MyType* myVar;
public:
    print() {
        //prints address of myVar(&myVar) value
    }
};

我观察到,在运行时,当我通过代码 in 和 通过代码 in 调用该方法时,两者都打印了不同的值。print()B.frameworkexe&myVar

它看起来像有一个单独的副本。我所期望和想要实现的是拥有 myVar 的单个副本?有没有办法实现这一目标?exemyVar

C++ 编译器错误 链接器 错误

评论

0赞 Adrian Mole 2/10/2023
您需要让动态框架导出类(以及其静态成员),并让可执行文件导入类。如何做到这一点将在一定程度上取决于你的编译器和/或目标平台。中方能否介绍一下具体情况?
0赞 Vivek Mangal 2/10/2023
我通过添加文件并通过 -exported_symbols_list 标志导出符号来导出符号。如何将其导入可执行文件?
0赞 Adrian Mole 2/10/2023
这取决于您的编译器/环境/平台。通常,您将一个宏定义为动态库/框架的“导出”和使用可执行文件的“导入”,然后将该宏用作类的属性。在 Windows 上,对于 DLL/EXE 接口,您将拥有 或 然后将其添加到您的类声明中,例如#define DLLEXP __declspec(dllexport)#define DLLEXP __declspec(dllimport)DLLEXPDLLEXP class MyClass {...

答: 暂无答案