簡體   English   中英

如何在C中獲取源文件的完整路徑?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM