我该如何使用GCC选项-iprefix和-iwithprefix?

3

我有一个C++应用程序,它被分成了多个模块。每个模块的目录结构如下:

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

我正在使用CMake来设置模块依赖和构建应用程序。如果module_a依赖于module_b,则在构建module_a时将添加module_bexport目录作为包含路径。
因此,如果有一个文件module_b/export/foo.hmodule_a需要的,那么在源文件中,您将使用#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的花式方式。然而,我测试了一下,仍然没有使它工作。因此,如果有人能解释这些选项的工作原理,那么即使它们不能帮助我解决问题,仍然是很好的。
1个回答

2

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

它只是一个快捷方式,避免每次都要写出一个常见的前缀。因此,不需要写成:

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

你可以改为:「相反,你可以执行以下操作:」。
cpp -iprefix /sys/root/ -iwithprefix a -withprefix b

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

如果您在交叉编译时遇到非常长的包含目录路径(可能甚至是必需的,参见getconf ARG_MAX),这将非常方便。

此外,有没有人有另一种解决我的问题的方法?

我偶然发现了-iprefix,因为我也遇到了与您相同的问题,并希望有一个现成的选项可以解决它。但实际上并没有,在Linux设备树构建中也存在着相同的问题:

ARCH=armARCH=arm64的设备树分别位于arch/arm/boot/dtsarch/arm64/boot/dts。有时,arm64设备树需要从arm目录中获取一些共享文件,但将所有体系结构的目录都放在路径上并不是一个好的解决方案。

Linux采取的方法是,在源树中建立一个专用目录,其中每个体系结构都有适当命名的符号链接,同时这个目录的路径以及当前活动的ARCH目录的路径都进入搜索路径。这样,ARCH=arm可以写#include "something.dtsi",但ARCH=arm64必须写#include <arm/something.dtsi>


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接