gpt4 book ai didi

build - SCons 和/或 CMake : any way to automatically map from "header included during compilation" to "corresponding object file must be linked"?

转载 作者:行者123 更新时间:2023-12-03 16:55:28 25 4
gpt4 key购买 nike

super 简单,完全无聊的设置:我有一个充满 .hpp 和 .cpp 文件的目录。其中一些 .cpp 文件需要构建到可执行文件中;自然,这些 .cpp 文件 #include 某些 .hpp 文件在同一目录中,然后可能包含其他文件,等等。这些 .hpp 文件中的大多数都有相应的 .cpp 文件,也就是说:如果 some_application.cpp #includes foo.hpp,无论是直接的还是传递性的,那么很可能还有一个 foo.cpp 文件需要编译并链接到 some_application 可执行文件中。

super 简单,但我仍然不知道构建它的“最佳”方式是什么,无论是在 SCons 还是 CMake(我都没有任何专业知识,除了在最后一天左右盯着文档和变得悲伤)。我担心我想要的那种解决方案实际上不可能(或至少非常复杂)在大多数构建系统中实现,但如果是这样,很高兴知道这一点,这样我就可以放弃并且不那么挑剔了.当然,我希望我是错的,考虑到我对构建系统(一般来说,特别是 CMake 和 SCons)一无所知,这并不奇怪。

当然,CMake 和 SCons 都可以自动检测到 some_application.cpp 需要重新编译,只要它依赖的任何头文件(直接或传递)发生变化,因为它们可以很好地“解析”C++ 文件以挑选出那些依赖关系。好的,太好了:我们不必手动列出每个 .cpp-#includes-.hpp 依赖项。但是:我们仍然需要决定在实际生成每个可执行文件时需要将哪些目标文件子集发送到链接器。

据我了解,处理这部分问题的两个最直接的替代方法是:

  • A. 手动明确且费力地枚举“使用此目标文件的任何内容也需要使用这些其他目标文件”依赖项,即使这些依赖项是 完全镜像 通过相应的-.cpp-transitively-includes-the-corresponding-.hpp 依赖项,构建系统已经为我们找到了麻烦 .为什么?因为电脑。
  • B. 将该目录中的所有目标文件转储到一个“库”中,然后让所有可执行文件依赖并链接到该库中。这要简单得多,据我所知大多数人都会这样做,但它也有点草率。大多数可执行文件实际上并不需要该库中的所有内容,并且如果仅更改一两个 .cpp 文件的内容,则实际上不需要重新构建。这不正是所谓的“构建系统”应该避免的那种不必要的计算吗? (我想如果库是动态链接的,它们可能不需要重建,但可以说我出于其他原因不喜欢动态链接的库就足够了。)

  • CMake 或 SCons 能否以任何远程直接的方式做得比这更好?我看到了一堆有限的方法来处理自动生成的依赖图,但没有通用的方法来这样做 交互式 (“好吧,构建系统,你 认为 的依赖是什么?嗯,在此基础上,添加以下依赖并再次思考:...”)。我不是 对此感到惊讶。不过,我还没有在任一构建系统中找到一种特殊用途的机制来处理 super 常见的情况,在这种情况下,链接时依赖项应该反射(reflect)相应的编译时 #include 依赖项。我在阅读文档时(诚然有些草率)错过了什么,还是每个人都选择了选项 (B) 并悄悄地讨厌自己和/或他们的构建系统?

    最佳答案

    您在 A) 点中的陈述“使用此对象文件的任何内容也需要使用这些其他对象文件”确实需要手动完成。编译器不会自动查找二进制文件所需的目标文件。您必须在链接时明确列出它们。如果我正确理解您的问题,您不希望必须明确列出二进制文件所需的对象,而是希望构建工具自动找到它们。我怀疑是否有任何构建也可以这样做:SCons 和 Cmake 绝对不会这样做。

    如果您有申请 some_application.cpp包括 foo.hpp (或这些 cpp 文件使用的其他头文件),随后需要链接 foo.cpp对象,然后在 SCons 中,您将需要执行以下操作:

    env = Environment()
    env.Program(target = 'some_application',
    source = ['some_application.cpp', 'foo.cpp'])

    这将 只有当“some_application.cpp”、“foo.hpp”或“foo.cpp”发生变化时链接。假设 g++,这将有效地转化为如下内容,独立于 SCons 或 Cmake。
    g++ -c foo.cpp -o foo.o
    g++ some_application.cpp foo.o -o some_application

    您提到您有“一个充满 .hpp 和 .cpp 文件的目录”,我建议您将这些文件组织到库中。不是所有的库都在一个库中,而是在逻辑上将它们组织成更小的、有凝聚力的库。然后您的应用程序/二进制文件将链接它们需要的库,从而最大限度地减少由于未使用对象而导致的重新编译。

    关于build - SCons 和/或 CMake : any way to automatically map from "header included during compilation" to "corresponding object file must be linked"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18141648/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com