簡體   English   中英

如何使用gcc生成可執行文件的依賴文件(在鏈接期間)

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

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