如何在 CMake 库和 CMake 目标之间共享单例

How can I share a singleton between CMake library and CMake target

提问人:blonded04 提问时间:10/31/2023 最后编辑:blonded04 更新时间:11/2/2023 访问量:53

问:

我有一个简单的设置,其中 oneAPI TBB 库通过我修改的 CMake 从源代码构建,我使用我编写的一些状态(在库中定义),以及我的小基准测试,我将一些字段设置为通过首次使用习惯的构造构建的单例状态:FetchContent

class state {
    // some code

public:
    static state& get_state() {
        static state instance;
        return instance;
    } 
};

但是,在我的应用程序中,我有 ,而在 TBB 中,我有 ,这对于所有工作线程都是相同的。application state is at 0xaaaae5b30200worker state is at 0xffffa355d200

在 CMake 库和 CMake 目标之间共享单例的正确方法是什么?

更新:实际上,对我有用的是将 TBB 构建为静态库,但可能有什么问题?

C++ CMake 单例 动态链接 TBB

评论

0赞 Pepijn Kramer 10/31/2023
为什么不在 main 中创建一个状态实例并使用依赖注入,这最终也会大大提高代码的单元可测试性。它还将明确您在共享状态中具有依赖关系的位置(像这样的引用语义倾向于随着时间的推移创建隐式依赖关系)。不错的文章: medium.com/@fatihcyln/...
0赞 blonded04 10/31/2023
@PepijnKramer我不能这样做,因为我正在修改一个大的 TBB 库,修改大量头文件以将某些内容从 main 传递给 TBB 运行时函数会造成太多痛苦
0赞 Pepijn Kramer 10/31/2023
公平地说,有时世界就是这样运作的;)你要找的是.我发现这个单例转换单元令人困惑。我会做的是将您的函数放入头文件中并使其成为内联函数(内意味着您向编译器/链接器承诺可以自由选择任何实现,因为您承诺它们都是相同的)。meyer's singleton accross multiple translation unitsget_state
0赞 blonded04 10/31/2023
@PepijnKramer这就是我目前实际正在做的事情,由于某种原因,它无论如何都不起作用(我现在稍微修改了问题中的代码片段)
0赞 Alan Birtles 10/31/2023
库是静态的还是共享的?单例在哪里声明?哪个操作系统?所有东西都是由同一个编译器编译的吗?请举一个最小的可重复的例子

答: 暂无答案