C++ 指示编译器忽略在#include中找到的头前缀

C++ 指示编译器忽略在#include中找到的头前缀,c++,g++,include-path,C++,G++,Include Path,[正如Cornstales在下面解释的,我试图去掉#include中使用的标题前缀。因此,这个问题似乎不是重复的] 我正在对一个图书馆做一些修改。我在本地拥有该库,因此它没有安装在其惯常的系统位置 我有一个测试源文件,它与库并排。测试文件有一系列包含项,如: #include <foo/libfoo.h> 和(-iNote.之间的空格似乎没有区别): 我遇到的问题是,我不知道如何告诉g++的意思是“/libfoo.h”。实际上,我正试图去掉用于包含标题的前缀。我已经在下面的手册中看

[正如Cornstales在下面解释的,我试图去掉
#include
中使用的标题前缀。因此,这个问题似乎不是重复的]

我正在对一个图书馆做一些修改。我在本地拥有该库,因此它没有安装在其惯常的系统位置

我有一个测试源文件,它与库并排。测试文件有一系列包含项,如:

#include <foo/libfoo.h>
和(
-iNote.
之间的空格似乎没有区别):

我遇到的问题是,我不知道如何告诉g++
的意思是
“/libfoo.h”
。实际上,我正试图去掉用于包含标题的前缀。我已经在下面的手册中看过了,但它并没有真正讨论这个场景

我为库使用了大约60个额外的测试文件。每个都有10或20个这样的包含项。因此,我无法在500或600个位置将
#include
更改为
#include“/libfoo.h”

我通过创建虚构的目录结构尝试了@rici的工作,但它破坏了GDB调试。GDB找不到类成员的符号,因此我无法设置断点来调试我试图修改的代码

如何告诉编译器在PWD中查找系统包含项


下面是一个典型的错误<代码>ECIES_FIPS在我的本地图书馆副本中

$ g++ -DNDEBUG=1 -g3 -Os -Wall -Wextra -I. -iquote . ecies-test.c++ -o ecies-test.exe ./libcryptopp.a
ecies-test.c++:29:17: error: no member named 'ECIES_FIPS' in namespace
      'CryptoPP'
using CryptoPP::ECIES_FIPS;
      ~~~~~~~~~~^
ecies-test.c++:44:5: error: use of undeclared identifier 'ECIES_FIPS'
    ECIES_FIPS<ECP>::Decryptor decryptor(prng, ASN1::secp256r1());
    ^
ecies-test.c++:44:16: error: 'ECP' does not refer to a value
    ECIES_FIPS<ECP>::Decryptor decryptor(prng, ASN1::secp256r1());
               ^
/usr/local/include/cryptopp/ecp.h:30:20: note: declared here
class CRYPTOPP_DLL ECP : public AbstractGroup<ECPPoint>
    ...

使用
-I
选项将当前文件夹添加为包含目录,您可以在当前目录中创建一个名为“foo”的文件夹,并将
libfoo.h
文件放入其中


显然,这不会去掉
#include
中的“foo”前缀,但这是一种解决方法。

使用
-I
选项将当前文件夹添加为包含目录,您可以在当前目录中创建一个名为“foo”的文件夹,并将
libfoo.h
文件放入其中


显然,这并没有去除您的
#include
中的“foo”前缀,但这是一种解决方法。

没有选项告诉gcc忽略包含路径中的目录前缀。如果您的程序包含
#include
,则包含列表中必须有一些
路径前缀
,以便
路径前缀/foo/header.h
解析为所需文件

虽然您不能将gcc配置为忽略foo,但您当然可以随意修改文件系统。您所需要的只是在某个地方有一个目录
foo
,它映射到存储头文件的目录。然后可以将该目录的父目录添加到搜索路径

例如:

mkdir /tmp/fake
ln -s /path/to/directory/containing/header /tmp/fake/foo
gcc -I /tmp/fake ...             # Ta-daa!

没有选项告诉gcc忽略包含路径中的目录前缀。如果您的程序包含
#include
,则包含列表中必须有一些
路径前缀
,以便
路径前缀/foo/header.h
解析为所需文件

虽然您不能将gcc配置为忽略foo,但您当然可以随意修改文件系统。您所需要的只是在某个地方有一个目录
foo
,它映射到存储头文件的目录。然后可以将该目录的父目录添加到搜索路径

例如:

mkdir /tmp/fake
ln -s /path/to/directory/containing/header /tmp/fake/foo
gcc -I /tmp/fake ...             # Ta-daa!
我为库使用了大约60个额外的测试文件。每个都有10或20个这样的包含项。所以我不能在500或600个地方通过并将#include改为#include.“/libfoo.h”

如果上述标准只是为了方便起见,那么可以使用
sed
之类的工具来完成所有工作。差不多

$ sed -i 's/\(^\s*#include\s*[<"]\)foo\/\([^>"]*[>"]\s*$\)/\1\2\t\/\/ This line was replaced/' *
$sed-i的/\(^\s*#include\s*[“]\s*$\)/\1\2\t\/\/此行已替换/'*
将所有出现的
#include
替换为
#include
(您可能需要稍微调整它,我现在在Windows机器上,无法测试它)。如果所有文件都在PWD中,这将起作用。如果有更复杂的文件结构,则可以将其与
grep
xargs
结合使用

注意:确保在使用时忽略svn目录

我为库使用了大约60个额外的测试文件。每个文件都有10个或20个这样的包含。所以我无法在500或600个位置将#include改为#include.“/libfoo.h”

如果上述标准只是为了方便起见,那么可以使用
sed
之类的工具来完成所有工作

$ sed -i 's/\(^\s*#include\s*[<"]\)foo\/\([^>"]*[>"]\s*$\)/\1\2\t\/\/ This line was replaced/' *
$sed-i的/\(^\s*#include\s*[“]\s*$\)/\1\2\t\/\/此行已替换/'*
将所有出现的
#include
替换为
#include
(您可能需要稍微调整它,我现在在Windows机器上,无法测试它)。如果所有文件都在PWD中,这将起作用。如果有更复杂的文件结构,那么它可以与
grep
xargs
结合使用


注意:确保使用时忽略svn目录。

是名为
foo
的当前目录(
)?如果是这样,您可以将其更改为
-I..
。或者,您可以将
foo
符号链接到
。我不知道如何告诉编译器将路径
foo/*
映射到
/*
,但这些可能是可行的解决方法。“I”选项应该能满足您的需要。这里有一个可能会有帮助的问题:谢谢@Cubia-我不知道为什么搜索没有发现这个问题。我投了第一个接近的重复票。@cornstales-我很愿意,但我有一个真正的库名为
foo
。@jww是否可以只添加一个名为“foo”的文件夹并将“libfoo.h”文件放在里面?标题前缀仍然存在,但您不必更改任何代码。当前目录(
)是否命名为
foo
?如果是这样,您可以将其更改为
-I..
。或者,您可以将
foo
符号链接到
mkdir /tmp/fake
ln -s /path/to/directory/containing/header /tmp/fake/foo
gcc -I /tmp/fake ...             # Ta-daa!
$ sed -i 's/\(^\s*#include\s*[<"]\)foo\/\([^>"]*[>"]\s*$\)/\1\2\t\/\/ This line was replaced/' *