[正如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
答案 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中,这将起作用。如果文件结构更复杂,则可以与grep
和xargs
结合使用。
注意:确保在使用时忽略svn目录。