簡體   English   中英

如何使用 C 預處理器找到庫的完整路徑?

[英]How to find the whole path to a library using the C preprocessor?

我正在尋找一個簡單的 bash 腳本,當給定系統 header 的名稱時,該腳本將返回其完整路徑,在#include <header>語句中將從該路徑中讀取它。 我已經有了類似的東西來查找 linker 使用的庫檔案。

ld -verbose -lz -L/some/other/dir | grep succeeded | sed -e 's/^\s*attempt to open //' -e 's/ succeeded\s*$//'

例如,這將返回libz存檔的路徑(在我的系統上是/lib/x86_64-linux-gnu/libz.so )。

對於請求的腳本,我知道我可以獲取gcc使用的包含目錄列表並自己搜索文件,但我正在尋找對預處理器內部發生的事情的更准確模擬(除非它很簡單)。

您可以使用預處理器來完成這項工作:

user@host:~$ echo "#include <stdio.h>" > testx.c && gcc -M testx.c | grep 'stdio.h'
testx.o: testx.c /usr/include/stdc-predef.h /usr/include/stdio.h \

您可以添加一點 bash-fu 來剪切您感興趣的部分

Pipe 輸入到預處理器,然后處理 output。 Gcc 預處理器 output 插入帶有您可以解析的信息和標志的#

$ f=stdlib.h
$ echo "#include <$f>" | gcc -xc -E - | sed '\~# [0-9]* "\([^"]*/'"$f"'\)" 1 .*~!d; s//\1/'
/usr/include/stdlib.h

它可以 output 多個文件,因為gcc具有#include_next並且可以在某些復雜情況下不正確地檢測到多個文件名包含同名的復雜情況,例如f=limits.h 所以你也可以過濾第二行,知道第一行總是stdc-predef.h

$ f=limits.h; echo "#include <$f>" | gcc -xc -E - | sed '/# [0-9]* "\([^"]*\)" 1 .*/!d;s//\1/' | sed '2!d'
/usr/lib/gcc/x86_64-pc-linux-gnu/10.1.0/include-fixed/limits.h

但真正自己搜索包含路徑,並不難:

$ f=limits.h; echo | gcc -E -Wp,-v - 2>&1 | sed '\~^ /~!d; s/ //' | while IFS= read -r path; do if [[ -e "$path/$f" ]]; then echo "$path/$f"; break; fi; done
/usr/lib/gcc/x86_64-pc-linux-gnu/10.1.0/include-fixed/limits.h

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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