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



[正如Cornstars在下面解释的那样,我正试图去掉#include中使用的头前缀。因此,这个问题似乎不是"如何使g++在特定目录中搜索头文件?"的重复问题。]

我正在对一个图书馆做一些改动。我在本地有库,所以它的不是安装在它的常规系统位置。

我有一个测试源文件,它与库并排。测试文件包含一堆内容,如:

#include <foo/libfoo.h>

它也有一堆习惯性的包含,比如:

#include <iostream>

我正在尝试使用编译测试文件

$ g++ ecies-test.c++ -I. -o ecies-test.exe ./libcryptopp.a

并且(-iquote .之间的间隔似乎没有什么区别):

$ g++ ecies-test.c++ -I. -iquote . -o ecies-test.exe ./libcryptopp.a

我遇到的问题是我不知道如何告诉g++<foo/libfoo.h>的意思是"./libfoo.h"。实际上,我正试图去掉用于包含标头的前缀。我已经在2.3搜索路径下查看了手册,但它并没有真正讨论这个场景。

我有大约60个额外的测试文件用于库。每个都有10或20个这样的包含。所以我不能在500或600个地方通过并将#include <foo/libfoo.h>更改为#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>
...

如果重要:

$ g++ --version
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 5.1 (clang-503.0.40) (based on LLVM 3.4svn)
Target: x86_64-apple-darwin12.6.0
Thread model: posix

没有告诉gcc忽略包含路径中的目录前缀的选项。如果程序包含#include <foo/header.h>,则包含列表中必须有一些path_prefix,以便path_prefix/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!

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

显然,这并没有去除#include中的"foo"前缀,但这是一种变通方法。

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

如果以上标准只是为了方便起见,那么可以使用sed这样的工具来完成所有工作。类似的东西

$ sed -i 's/(^s*#includes*[<"])foo/([^>"]*[>"]s*$)/12t// This line was replaced/' *

将用#include <file.h>替换所有出现的#include <foo/file.h>(您可能需要稍微调整一下,我现在在Windows机器上,无法测试它)。如果所有文件都在PWD中,这将起作用。如果存在更复杂的文件结构,则可以将其与grepxargs结合使用。

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

相关内容

  • 没有找到相关文章

最新更新