【问题标题】:How do I use GCC options -iprefix and -iwithprefix?如何使用 GCC 选项 -iprefix 和 -iwithprefix?
【发布时间】:2020-03-05 01:30:39
【问题描述】:

我有一个分成模块的 C++ 应用程序。每个模块的目录结构如下所示:

module_a/
  export/  <-- module_a public interface
  src/     <-- module_a private source
  test/
    src/   <-- unittests for module_a

我正在使用 CMake 来设置模块依赖项并构建应用程序。如果module_a 依赖于module_bmodule_bexport 目录在构建module_a 时添加为包含路径。

所以,如果有module_a 需要的文件module_b/export/foo.h,那么在源文件中您将使用#include "foo.h"

我正在寻找一种方法来使模块名称成为包含指令的一部分。所以对于上面的例子,我想(必须)写#include "module_b/foo.h"

这可以通过 GCC 选项 -iprefix 和 -iwithprefix 完成吗?我搜索了用法示例,但我只能找到 GCC 手册的副本和引用,我认为这并不能很好地解释它。

我试过这样用:

$ find -type f
./src
./src/main.cc
./export
./export/bar.h

$ g++ -iprefix foo/ -iwithprefix export/ src/main.cc
src/main.cc:1:10: fatal error: foo/bar.h: No such file or directory
    1 | #include "foo/bar.h"
      |          ^~~~~~~~~~~
compilation terminated.

$ gcc --version
gcc (Debian 9.2.1-17) 9.2.1 20191102

但正如您所见,它不起作用。我应该如何使用 -iprefix 和 -iwithprefix?

另外,有人对我的问题有其他解决方案吗?我有点担心 IDE 和其他编译器可能无法理解 -iprefix 和 -iwithprefix,因此也欢迎任何其他解决方案。

编辑:发布此问题后,我立即意识到-iprefix foo/ -iwithprefix bar 可能只是写-I foo/bar 的一种奇特方式。但是,我对此进行了测试,但仍然无法正常工作。因此,如果有人能解释这些选项是如何工作的,那还是很好的,即使他们不会帮助我解决我的问题。

【问题讨论】:

    标签: c++ c gcc c-preprocessor


    【解决方案1】:

    我应该如何使用 -iprefix 和 -iwithprefix?

    这只是避免每次都写出公共前缀的捷径。所以而不是:

    cpp -Idirafter /sys/root/a -Idirafter /sys/root/b
    

    你可以这样做:

    cpp -iprefix /sys/root/ -iwithprefix a -withprefix b
    

    (如果您希望 -Iwithprefixbefore 等效于 -I,请替换 -Iwithprefix。)

    这可以在很长的包含目录路径中派上用场,就像您在交叉编译时可能遇到的那样(甚至可能需要,参见getconf ARG_MAX

    另外,有没有人可以解决我的问题?

    我偶然发现了-iprefix,因为我也遇到了同样的问题,并希望有一个开箱即用的选项。没有,但 Linux 设备树构建有同样的问题:

    ARCH=armARCH=arm64 的设备树分别在 arch/arm/boot/dtsarch/arm64/boot/dts 中。有时,arm64 设备树需要 arm 目录中的一些通用文件,但是在路径中包含所有架构的 dts 目录并不是一个很好的解决方案。

    相反,Linux 所做的是 having a dedicated directory in the source tree 带有适当命名的符号链接到每个体系结构和此目录的路径以及当前活动的 ARCH go into the search path 的目录。这样ARCH=arm 可以写成#include "something.dtsi",但ARCH=arm64 必须写成#include &lt;arm/something.dtsi&gt;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-24
      • 1970-01-01
      • 2018-09-27
      • 2018-12-11
      • 2012-06-04
      • 2016-11-09
      • 2019-08-04
      相关资源
      最近更新 更多