如何使用 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 选项(-Wl,--tracegcc)。此选项在链接期间生成 list of libraries used。它的输出具有以下格式:

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/.*(\(.*\)).*/ \/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/.*(\(.*\)).*/ \/p' >> myprog.dep