gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 15:38:52 24 4
gpt4 key购买 nike

我有一个分成模块的 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_bexport 目录在构建 module_a 时添加为包含路径

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

我正在寻找一种方法,使模块名称成为 include 指令的一部分。所以对于上面的例子我想(不得不)写#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。但是,我对此进行了测试,但仍然无法正常工作。因此,如果有人可以解释这些选项是如何工作的,那将是很好的,即使它们不会帮助我解决我的问题。

最佳答案

How should I use -iprefix and -iwithprefix?

这只是避免每次都必须写出公共(public)前缀的捷径。所以不是:

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

您改为:

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

(如果您希望它等同于 -Iwithprefix,请将 -Iwithprefixbefore 替换为 -I。)

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

Also, does anyone have another solution to my problem?

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

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

Linux 取而代之的是 having a dedicated directory in the source tree,每个架构都有适当命名的符号链接(symbolic link),这个目录的路径以及当前事件的目录 ARCH go into the search path。这样,ARCH=arm 可以写入 #include "something.dtsi",但 ARCH=arm64 必须改为写入 #include <arm/something.dtsi>

关于c++ - 我如何使用 GCC 选项 -iprefix 和 -iwithprefix?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58766163/

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