gpt4 book ai didi

c - 如何在 C 中获取源文件的完整路径?

转载 作者:太空宇宙 更新时间:2023-11-04 07:48:51 27 4
gpt4 key购买 nike

我知道我可以执行以下操作从 C 程序中打印源文件:

printf("__FILE__: %s\n", __FILE__);

但是,根据 docs,这会产生“预处理器打开文件的路径” .在这种情况下,它给出:

__FILE__: common.c

我进一步知道我可以使用以下 clang feature打印源文件:

void *pc = __builtin_return_address(0);
char pc_desc[1024];
__sanitizer_symbolize_pc(pc, "%p %F %L", pc_desc, sizeof(pc_desc));
printf("__sanitizer_symbolize_pc: %s\n", pc_desc);

不过,类似地,它只打印相对路径:

__sanitizer_symbolize_pc: 0x10563a873 in Y common.c:4

当两个文件在单独的子目录中的同一行上具有相同的静态函数(在本例中为 Y)时,就会出现问题,例如:

__sanitizer_symbolize_pc: 0x10563a873 in Y common.c:4
__sanitizer_symbolize_pc: 0x10563a933 in Y common.c:4

当然可以重构代码,或者程序运行后二进制匹配源码,或者改编译过程从上层编译common.c文件父文件夹。但是给出这个例子,如何从 C 程序本身获取源文件的完整路径?

clang 的IR 似乎保留了目录信息in metadata ,但不清楚它是如何被访问的。例如,common.ll 文件包含以下行:

!1 = !DIFile(filename: "common.c", directory: "/full/path/to/subdir")

<子>我在 Mac OS 上使用手动编译的 clang 7.0.1。

最佳答案

可以考虑在编译时给它一个全路径吗?

像下面这样,调用realpath取全路径

SRCS = $(wildcard *.c)
OBJS = $(SRCS:.c=.o)
CFLAGS = -g -Wall
CC = clang
BIN = test

$(BIN) : $(OBJS)
$(CC) $^ -o $@

%.o : %.c
$(CC) $(CFLAGS) -c $(realpath $<)

clean:
rm -f $(OBJS) $(BIN)

关于c - 如何在 C 中获取源文件的完整路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55127799/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com