【问题标题】:How to write cmake file when using singleton pattern in c++在c ++中使用单例模式时如何编写cmake文件
【发布时间】:2019-01-15 06:02:20
【问题描述】:

现在我要将我的一个项目从 VS 项目转移到 cmake 项目。在这个项目中,我使用一个单例类来管理所有其他模块。在VS项目中是没有问题的,但是在cmake项目中会出现循环依赖的问题。例如,有模块“canbus”和单例类“manager”。

在canbus模块中,因为会使用单例类,所以CMakeLists.txt文件是这样的:

add_library(canbus STATIC
    CanBus.cpp)
target_include_directories(canbus PUBLIC
    ${CMAKE_SOURCE_DIR})
target_link_libraries(canbus PRIVATE
    manager)

经理类是这样的:

class Manager
{
public:
    static Manager* instance();
    canbus::CanBus* getCanBus();

private:
    canbus::CanBus _canBus;

private:
    Manager(void) {}
    ~Manager(void) {}
    Manager(const Manager& rhs) = delete;
    Manager& operator=(const Manager& rhs) = delete;
};

所以管理器的 CMakeLists.txt 文件是这样的:

add_library(manager STATIC
    Manager.cpp)
target_include_directories(manager PUBLIC
    ${CMAKE_SOURCE_DIR})
target_link_libraries(manager PUBLIC
    canbus
    )

canbus 和 manager 之间会有循环依赖,我想知道是否有更好的方法来处理这个问题,或者我应该改变我的项目的结构?希望熟悉cmake的人能给我一些建议或意见。谢谢。

【问题讨论】:

    标签: c++ cmake singleton


    【解决方案1】:

    如果两个静态库相互依赖,就意味着它们应该组成一个库。

    另一种方法是不在库目标上使用target_link_libraries。它们可以正常编译,但是当您尝试在可执行目标中使用 any 时,您必须使用这两个库调用 target_link_libraries

    【讨论】:

    • 感谢您的回答,如果不使用target_link_libraries,我应该使用哪个命令?因为对于现代 cmake,它更喜欢使用target_。是的,我的项目可以编译运行,但是我认为由于循环依赖,编译速度有点慢。
    猜你喜欢
    • 2023-03-17
    • 1970-01-01
    • 2019-04-16
    • 1970-01-01
    • 1970-01-01
    • 2011-09-17
    • 2014-09-05
    • 1970-01-01
    • 2021-01-31
    相关资源
    最近更新 更多