【问题标题】:C++ makefiles - Header files dependencies with external librariesC++ makefiles - 与外部库的头文件依赖关系
【发布时间】:2013-09-12 03:09:03
【问题描述】:

我想将依赖目标添加到我的 Makefile,我知道这可以通过 makedepend 或 g++ -MM 选项来完成,我愿意使用它们中的任何一个,但我更喜欢 -MM 选项,因为它允许我排除标准库(不知道makedepend能不能做到)。

问题是我在我的应用程序中使用了一些外部库头文件,我希望将这些头文件从生成的依赖项中排除,那么如何从这些生成的依赖项中排除某些目录。 [Edit-start] 我已经尝试过使用grep -v,但问题是,如果排除的行是某个目标中的最后一个换行行,则下一个目标将连接到该目标,因为在导致损坏的依赖规则之前,在行尾转义“\”字符。除此之外,通过库头解析它们所需的时间[Edit-end]

另一个问题是,我如何编辑生成的目标文件目标的后缀,我正在使用一个 Makefile,它通过使用这样的目标来编译通过变量提供的源文件:

%.o: %.cpp
    g++ $< -o$*.o ...

【问题讨论】:

  • 您没有足够准确地解释所涉及的确切外部库是什么以及它们是如何在您的Makefile 中给出的。你为他们使用pkg-config 吗?您不能使用 grep -v 从生成的依赖项中过滤掉它们吗?请从您的Makefile提供更多代码...
  • @BasileStarynkevitch 库,如 wxWidgets,由 wx-config 在 Makefile 中提供;其他库我使用 -I 选项包含它们的标题。我已经尝试使用grep -v,但问题是,如果排除的行是某个目标中的最后一个换行行,则下一个目标将连接到该目标,因为它之前的行中的“\”字符导致损坏的依赖规则。除此之外,通过库头解析它们所花费的时间。

标签: c++ linux makefile g++ dependencies


【解决方案1】:

第一个问题(外部库)可以通过首先使用grep -v然后将输出传递给sed 'N;s/\\\n\(.*\.o\)/\n\1/;P;D'来解决,这会删除不需要的转义字符'\',以解决由于@引入的排除而导致的连接目标问题987654324@。但是通过外部库头解析它们的时间开销仍然保持原样。

第二个问题(生成的目标后缀编辑)也可以通过使用sed 's/.o:/$(MY_SUFFIX):/' 来解决,其中$(MY_SUFFIX) 是在生成的目标规则中替换.o 的后缀。

【讨论】:

    【解决方案2】:

    #pragma GCC system_header 是一个 gcc pragma,用于识别系统头文件。

    您可以将代理标头与此编译指示一起使用,其中包括库标头

    //Proxy_header.h
    #ifndef PROXY_HEADER_H
    #define PROXY_HEADER_H
    
    #pragma GCC system_header
    
    #include "external_library.h"
    
    #endif
    

    但后处理依赖项似乎更清晰。


    -MF file似乎是你要编辑依赖文件后缀的gcc选项。

    【讨论】:

    • 好吧,这是一个不错的技巧,但不幸的是,这意味着我将为使用的外部头文件添加 header_proxies,并编辑它们的所有文件以让他们采用这种技术。我同意你的看法,后处理看起来更干净,所以我希望有一些“排除”选项或类似的东西。
    • 据我所知,-MF 指定要输出依赖规则的文件。我的目标是编辑目标本身的后缀,例如而不是生成foo.o: foo.cpp foo.h,我需要使其成为foo$(MY_SUFFIX): foo.cpp foo.h
    • 后处理:grep -v 排除可能会有所帮助。 sed s/.o:/$(MY_SUFFIX)/g 替换扩展名...(不确定我的 sed 语法是否正确,但您有这个想法)。
    • 我已经尝试使用 grep -v 但问题是,如果排除的行是某个目标中的最后一个换行行,则由于“\”,下一个目标将加入该目标在它之前的行中的字符导致损坏的依赖规则。除此之外,通过库头解析它们所需的时间。根据更换扩展:是的,我知道了,我认为通过 sed 更换扩展就可以了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-12
    • 1970-01-01
    • 2017-04-23
    • 1970-01-01
    • 2017-02-14
    • 1970-01-01
    • 2013-05-24
    相关资源
    最近更新 更多