如何使用gcc

时间:2015-11-16 04:25:17

标签: gcc makefile build-automation

gcc 具有-M - 类选项(-MMD-MF等),允许在编译源文件期间生成依赖文件。依赖项文件包含 Makefile 规则,用于描述生成的目标文件所依赖的源文件和标头。依赖文件可以包含在 Makefile 中,然后 make 会在标题更改时自动重新编译源文件。

我需要一个类似的选项,但是在链接可执行文件时生成依赖文件。依赖项文件应包含用于链接可执行文件的库列表,因此如果更新了任何库, make 将自动重新执行可执行文件的链接。

我尝试使用相同的标记(-MMD-MF),但它们不适用于链接。它们似乎只是用于在编译期间生成依赖文件。

是否有其他标志或方法为可执行文件生成依赖文件?

1 个答案:

答案 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