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

时间:2015-04-19 01:59:21

标签: c++ g++ include-path

[正如Cornstalks在下面解释的那样,我正试图去掉#include中使用的标题前缀。所以看来这个问题不是How to make g++ search for header files in a specific directory?]

的重复

我正在对库进行一些更改。我在本地拥有该库,因此其 not 安装在其惯用的系统位置。

我有一个测试源文件,它与库并排。测试文件有一堆包括:

#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 Search Path下的手册,但它没有真正讨论这种情况。

我有大约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

3 个答案:

答案 0 :(得分:3)

没有选项告诉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!

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

  

我有大约60个用于库的额外测试文件。并且每个都有10或20个这样的包含。所以我无法通过并将#include改为#include&#34; ./ libfoo.h&#34;在500或600个地方。

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

这样的东西
$ sed -i 's/\(^\s*#include\s*[<"]\)foo\/\([^>"]*[>"]\s*$\)/\1\2\t\/\/ This line was replaced/' *

会将#include <foo/file.h>的所有匹配项替换为#include <file.h>(您可能需要稍微调整一下,我目前在Windows计算机上进行测试并且无法对其进行测试) 。如果所有文件都在PWD中,这将起作用。如果文件结构更复杂,则可以与grepxargs结合使用。

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