[英]How to get full path to source file in C?
我知道我可以執行以下操作從C程序中打印源文件:
printf("__FILE__: %s\n", __FILE__);
但是,根據docs ,這將產生“預處理器打開文件的路徑”。 在這種情況下,它給出:
__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程序本身獲取源文件的完整路徑?
似乎clang的IR 在元數據中保留了目錄信息,但不清楚如何訪問它。 例如, 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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.