如何使用 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,--trace
与 gcc)。此选项在链接期间生成 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
gcc 有 -M
-class 选项(-MMD
、-MF
等),允许生成依赖项编译源文件时的文件。依赖文件包含 Makefile 规则,描述生成的目标文件依赖于哪些源文件和头文件。依赖文件可以包含在 Makefile 中,然后 make 将在头文件更改时自动重新编译源文件。
我需要一个类似的选项,但用于在链接可执行文件期间生成依赖文件。依赖文件应包含用于链接可执行文件的库列表,因此如果更新了任何库,make 将自动重新执行可执行文件的链接。
我尝试使用相同的标志(-MMD
、-MF
),但它们无法用于链接。好像只是编译时生成依赖文件而已
是否有任何其他标志或方法来生成可执行文件的依赖文件?
到目前为止,我还没有找到专门的 gcc 选项来为可执行文件生成依赖文件,但找到了 --trace
选项(-Wl,--trace
与 gcc)。此选项在链接期间生成 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