查找include指令使用了哪个文件

时间:2019-02-19 23:26:37

标签: c++ c header include

是否有一种方法可以获取#include <hdr.h>指令读取的文件的绝对路径? 还有#include "hdr.h"指令? 我正在Win 10 / Msys2下工作。

我的意思是要在编译stdint.h时找到哪个src/sha1-git.c,因为:

  1. 它应该声明uint32_t,但显然并没有这样做,

    $ make -V=1
    
    /bin/sh ../../libtool  --tag=CC   --mode=compile gcc -DPACKAGE_NAME=\"aircrack-ng\" -DPACKAGE_TARNAME=\"aircrack-ng\" -DPACKAGE_VERSION=\"1.5.2\" -DPACKAGE_STRING=\"aircrack-ng\ 1.5.2\" -DPACKAGE_BUGREPORT=\"https://forum.aircrack-ng.org\" -DPACKAGE_URL=\"\" -DPACKAGE=\"aircrack-ng\" -DVERSION=\"1.5.2\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DLT_OBJDIR=\".libs/\" -D_REVISION=\"1.5.2\" -DHAVE_OPENSSL_CRYPTO_H=1 -DHAVE_OPENSSL_CMAC_H=1 -DHAVE_OPENSSL_CMAC_H=1 -DHAVE_SQLITE3_H=1 -DHAVE_SQLITE3=1 -DHAVE_SQLITE=1 -D_FILE_OFFSET_BITS=64 -DHAVE_PTHREAD_PRIO_INHERIT=1 -D_REENTRANT=1 -DHAVE___MINGW_ALIGNED_MALLOC=1 -DCACHELINE_SIZE=64 -DINTEL_ASM=1 -DCACHELINE_SIZE=64 -I.  -I../.. -I../../src/include -I../../src   -DCYGWIN -DMSYS2 -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE -D_FORTIFY_SOURCE=2 -pthread   -Wall -O3 -std=gnu99 -fno-strict-aliasing -Wpointer-arith -Wstrict-overflow=2 -Wstrict-prototypes -fvisibility=hidden -Wno-unused-but-set-variable -Wno-array-bounds  -mconsole -mwindows -DMSYS2 -MT libaircrack_crypto_la-sha1-git.lo -MD -MP -MF .deps/libaircrack_crypto_la-sha1-git.Tpo -c -o libaircrack_crypto_la-sha1-git.lo `test -f 'sha1-git.c' || echo './'`sha1-git.c
    libtool: compile:  gcc -DPACKAGE_NAME=\"aircrack-ng\" -DPACKAGE_TARNAME=\"aircrack-ng\" -DPACKAGE_VERSION=\"1.5.2\" "-DPACKAGE_STRING=\"aircrack-ng 1.5.2\"" -DPACKAGE_BUGREPORT=\"https://forum.aircrack-ng.org\" -DPACKAGE_URL=\"\" -DPACKAGE=\"aircrack-ng\" -DVERSION=\"1.5.2\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DLT_OBJDIR=\".libs/\" -D_REVISION=\"1.5.2\" -DHAVE_OPENSSL_CRYPTO_H=1 -DHAVE_OPENSSL_CMAC_H=1 -DHAVE_OPENSSL_CMAC_H=1 -DHAVE_SQLITE3_H=1 -DHAVE_SQLITE3=1 -DHAVE_SQLITE=1 -D_FILE_OFFSET_BITS=64 -DHAVE_PTHREAD_PRIO_INHERIT=1 -D_REENTRANT=1 -DHAVE___MINGW_ALIGNED_MALLOC=1 -DCACHELINE_SIZE=64 -DINTEL_ASM=1 -DCACHELINE_SIZE=64 -I. -I../.. -I../../src/include -I../../src -DCYGWIN -DMSYS2 -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE -D_FORTIFY_SOURCE=2 -pthread -Wall -O3 -std=gnu99 -fno-strict-aliasing -Wpointer-arith -Wstrict-overflow=2 -Wstrict-prototypes -fvisibility=hidden -Wno-unused-but-set-variable -Wno-array-bounds -mconsole -mwindows -DMSYS2 -MT libaircrack_crypto_la-sha1-git.lo -MD -MP -MF .deps/libaircrack_crypto_la-sha1-git.Tpo -c sha1-git.c  -DDLL_EXPORT -DPIC -o .libs/libaircrack_crypto_la-sha1-git.o
    sha1-git.c: In function 'blk_SHA1_Final':
    sha1-git.c:328:21: error: 'uint32_t' undeclared (first use in this function); did you mean 'wint_t'?
      padlen[0] = htonl((uint32_t)(ctx->size >> 29));
    

编辑

  1. 我的Msys2子目录树中有很多stdint.h作为候选对象。我应该可以通过检查编译命令行来“手动”跟踪包含stdint.h的内容,列出包含目录的顺序,等等,而我之前做了几次。 但是我的意思是自动执行此操作,以避免出现错误。

PS:由于我属于Msys2,所以我(递归)更改了所有出现的 #include <arpa/inet.h> 通过 #include <winsock.h>src/*.hsrc/*.c中。 我在文件src/sha1-git.c中添加了 #include <stdint.h> 之后(插入第43行)获得uint32_t

PS2:还有另一个文件src/aircrack-crypto/sha1-git.c没有 #include <stdint.h>。 问题是此文件的编译。我在另一个文件中添加了#include ...,编译继续

PS3:我的意思是要做好这项工作,所以也许对此特定OP的答案只是朝着目标迈出了一步,但还不够…… 编辑2 已确认。 在必须执行make V=1 CFLAGS="-I/usr/include" LDFLAGS="-L/usr/lib"(否则在编译sys/wait.h时未找到common.c之后),我得到了

.../MSYS2Portable/App/msys32/mingw64/x86_64-w64-mingw32/include/winsock.h:309:34: error: conflicting types for 'gethostname'                                                                                                                                                                       
   WINSOCK_API_LINKAGE int WSAAPI gethostname(char *name,int namelen);                                                                                                    
                                  ^~~~~~~~~~~                                                                                                                             
In file included from .../MSYS2Portable/App/msys32/usr/include/unistd.h:4,                                               
                 from common.c:42:                                                                                                                                        
.../MSYS2Portable/App/msys32/usr/include/sys/unistd.h:300:6: note: previous declaration of 'gethostname' was here        
  int gethostname (char *__name, size_t __len);                                                                                                                           
      ^~~~~~~~~~~                                                                                                                                                         
make[2]: *** [Makefile:713: libaircrack_util_la-common.lo] Error 1                                                                                                        

似乎mingw64/x86_64-w64-mingw32/include中的文件与usr/include中的文件不一致。 而且sys/wait.h中没有mingw64/x86_64-w64-mingw32/include,因此我还必须在搜索路径中添加usr/include,这给我带来了麻烦。

我可能会放弃在Msys2下进行编译,而会得到一个vbox。

1 个答案:

答案 0 :(得分:1)

将评论中的内容传输到答案并进行扩展。

使用GCC,-H选项列出了包含的标头,并且还标明了嵌套级别。您需要指定正在使用的编译器。适用于GCC的内容可能适用于Clang,但不适用于其他编译器。

由于您使用的是自动没收的项目和GCC,因此您至少有两个选项来获取特定文件的信息。

  1. 广泛-不具体:

    ./configure CC='gcc -H'
    

    这会将C编译器设置为gcc -H,这会很吵。无论如何,这样做可能是明智的,但只有在配置阶段出现问题时才可能这样做(除非下一个选项中的警告最终生效)。

  2. 窄-特定文件:

    make …normal options…   CC='gcc -H' problemchild.o
    

    这会将C编译器设置为gcc -H,同时编译特定的问题子源文件。如果您要处理的项目的源代码位于多个目录中,或者源代码位于一个目录中,而目标代码位于另一个目录中,或者正在构建的其他一些变体中,则实现此目标可能比预期的要难得多。系统使用。

无论哪种方式,或使用任何变体,该思想的关键部分是您告诉系统编译器的名称是gcc -H而不是gcc。通常可以使它起作用。有时,系统会为C编译器使用CC以外的Make宏名称(用于C ++编译器的宏名称也会有所不同)。在这种情况下,您必须找出其使用的名称(例如,通常可以使用./configure CC=/opt/gcc/bin/gcc,但是您可能需要查找使用/opt/gcc/bin/gcc的位置并使用makefile对其进行相应的编辑。

请尽快停止使用-H选项。它在大型系统上产生大量输出。例如,这可能是我进行的构建中的几百行标题。但是,使用它可能会提供很多信息。