【问题标题】:How do you specify a threads dependency in cmake for distributing a header-only library in a cross-platform way? [duplicate]如何在 cmake 中指定线程依赖项以跨平台方式分发仅标头库? [复制]
【发布时间】:2021-08-26 23:18:07
【问题描述】:

我正在为一个不错的小型 c++ 仅标头库做出贡献,并且我正在修复 cmake 以使该库可以正确安装并可供其他项目查找/使用。库本身确实利用了 stl 的各个部分,包括您需要手动链接的部分。具体来说,它利用了std::thread 等。如何以跨平台的方式指定仅标头库依赖于在 linux 上链接 pthread 而在 windows 或其他平台上做其他事情?

也许这不是问题,但我认为你应该为 linux 做这样的事情:

target_link_options(header-only-project INTERFACE -pthread)

但是,这在 Windows 上会感觉不合适(我猜你在没有额外链接器标志的情况下获得线程?)。在分发尚未采用二进制形式的库时,以跨平台方式指定此类依赖项的正确方法是什么?

【问题讨论】:

    标签: c++ cmake cross-platform


    【解决方案1】:

    CMake 附带了 Threads 包用于此目的:

    find_package(Threads REQUIRED)
    target_link_libraries(header-only-project INTERFACE Threads::Threads)
    

    【讨论】:

    • 啊,是的,我知道这一点,但我主要担心的是下游项目知道我的仅标头库依赖于Threads::Threads。我曾假设Threads::Threads 是一个目标,根据您运行find_package(Threads) 的平台,它的解析方式不同。我不明白如何笼统地说,嘿,当您使用我的仅标头库时,您将需要依赖Threads::Threads,无论您的系统是否可行。也许这正是它的工作原理,我只是假设 Threads 目标是特定于平台的。
    • 啊,但也许确实不是问题,因为执行上述 cmake 的 add_subdirectory 确实会运行 find_package 并仅在目标平台上解析 Threads 目标。哈哈哈抱歉花了这么长时间才沉入其中。这个理解正确吗?
    • 那么package_config_files 呢?它们会正常工作,传递线程依赖吗?我想他们也会,因为你可能不得不在目标平台上make install他们。
    • "当您使用我的仅标头库时,您将需要依赖 Threads::Threads"。这就是target_link_libraries() 所做的。依赖于您的库的任何目标都将“继承”依赖项。
    • “还有 package_config_file 怎么样”,只要你 EXPORT 目标本身,而不仅仅是标头和二进制文件,它应该“正常工作”。
    猜你喜欢
    • 2011-12-30
    • 1970-01-01
    • 2020-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-18
    • 1970-01-01
    相关资源
    最近更新 更多