[英]How to generate dependency file for executable (during linking) with gcc
gcc具有-M
-class選項( -MMD
, -MF
等),允許在編譯源文件期間生成依賴文件。 依賴文件包含Makefile規則,描述生成的目標文件所依賴的源文件和頭文件。 依賴文件可以包含在Makefile中 ,然后在更改標頭時, make將自動重新編譯源文件。
我需要類似的選項,但是在鏈接可執行文件時會生成依賴文件。 依賴性文件應包含用於鏈接可執行文件的庫列表,因此,如果更新了任何庫, make將自動重新執行可執行文件的鏈接。
我嘗試使用相同的標志( -MMD
, -MF
),但它們不適用於鏈接。 看來它們僅用於在編譯過程中生成依賴文件。
還有其他用於生成可執行文件依賴文件的標志或方法嗎?
到目前為止,我還沒有找到用於生成可執行文件依賴項的專用gcc選項,但是找到了--trace
選項(與gcc一起使用時為-Wl,--trace
-trace )。 此選項生成鏈接期間使用的庫列表 。 其輸出具有下一個格式:
gcc -Wl,--trace myprog.c -o myprog -L. -lmylib
-lmylib (./libmylib.a)
-lgcc_s (/usr/lib/x86_64-linux-gnu/gcc/x86_64-linux-gnu/4.5.2/libgcc_s.so)
...
然后可以使用sed將庫列表轉換為Makefile規則:
echo "myprog: " > myprog.dep
gcc -Wl,--trace myprog.c -o myprog -L. -lmylib \
| sed -n 's/.*(\(.*\)).*/\1 \\/p' >> myprog.dep
因此, myprog.dep
將具有以下內容:
myprog: \
./libmylib.a \
/usr/lib/x86_64-linux-gnu/gcc/x86_64-linux-gnu/4.5.2/libgcc_s.so \
...
該依賴文件可以包含在Makefile中,並且如果更新了任何庫, make將重新鏈接myprog
。
依賴文件不包含目標文件列表,但通常在Makefile -script中無需編譯器的幫助即可知道目標文件:
myprog: $(OBJS)
gcc -Wl,--trace $^ -o myprog -L. -lmylib | sed -n 's/.*(\(.*\)).*/\1 \\/p' >> myprog.dep
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.