是否有一种方法可以获取#include <hdr.h>
指令读取的文件的绝对路径?
还有#include "hdr.h"
指令?
我正在Win 10 / Msys2下工作。
我的意思是要在编译stdint.h
时找到哪个src/sha1-git.c
,因为:
它应该声明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));
编辑
stdint.h
作为候选对象。我应该可以通过检查编译命令行来“手动”跟踪包含stdint.h
的内容,列出包含目录的顺序,等等,而我之前做了几次。
但是我的意思是自动执行此操作,以避免出现错误。 PS:由于我属于Msys2,所以我(递归)更改了所有出现的
#include <arpa/inet.h>
通过
#include <winsock.h>
在src/*.h
和src/*.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。
答案 0 :(得分:1)
将评论中的内容传输到答案并进行扩展。
使用GCC,-H
选项列出了包含的标头,并且还标明了嵌套级别。您需要指定正在使用的编译器。适用于GCC的内容可能适用于Clang,但不适用于其他编译器。
由于您使用的是自动没收的项目和GCC,因此您至少有两个选项来获取特定文件的信息。
广泛-不具体:
./configure CC='gcc -H'
这会将C编译器设置为gcc -H
,这会很吵。无论如何,这样做可能是明智的,但只有在配置阶段出现问题时才可能这样做(除非下一个选项中的警告最终生效)。
窄-特定文件:
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
选项。它在大型系统上产生大量输出。例如,这可能是我进行的构建中的几百行标题。但是,使用它可能会提供很多信息。