Как получить полный путь к исходному файлу в C? - PullRequest
0 голосов
/ 12 марта 2019

Я знаю, что могу распечатать исходный файл из программы на C следующим образом:

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

Однако это дает «путь, по которому препроцессор открыл файл», в соответствии с документами . В этом случае это дает:

__FILE__: common.c

Я также знаю, что могу использовать следующую функцию clang для печати исходного файла:

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?

Кажется, что IR clang имеет информацию о каталоге, сохраненную в метаданных , но неясно, как к нему обращаются. Например, файл common.ll содержит следующую строку:

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

Я использую вручную скомпилированный Clang 7.0.1 на Mac OS.

1 Ответ

2 голосов
/ 13 марта 2019

может рассмотреть возможность дать ему полный путь во время компиляции?

, как показано ниже, вызовите 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)
...