gcc 具有-M
- 类选项(-MMD
,-MF
等),允许在编译源文件期间生成依赖文件。依赖项文件包含 Makefile 规则,用于描述生成的目标文件所依赖的源文件和标头。依赖文件可以包含在 Makefile 中,然后 make 会在标题更改时自动重新编译源文件。
我需要一个类似的选项,但是在链接可执行文件时生成依赖文件。依赖项文件应包含用于链接可执行文件的库列表,因此如果更新了任何库, make 将自动重新执行可执行文件的链接。
我尝试使用相同的标记(-MMD
,-MF
),但它们不适用于链接。它们似乎只是用于在编译期间生成依赖文件。
是否有其他标志或方法为可执行文件生成依赖文件?
答案 0 :(得分:0)
到目前为止,我还没有找到用于为可执行文件生成依赖项文件的专用 gcc 选项,但在与 gcc一起使用时找到--trace
选项(-Wl,--trace
)。此选项在链接期间生成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/.*(\(.*\)).*/\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