即使我在makefile中传递-c,make也会自动尝试链接

时间:2011-07-20 20:31:18

标签: c makefile

我是makefiles的新手,所以如果这是一个愚蠢的问题,我会提前道歉。我也从我的makefile中删除了大多数变量,因为它们没有正常工作(gnu make告诉我$(myvar)应该完全替换myvar的值,但make的输出显示我没有发生这种情况),所以我为丑陋和超过80个字符的行道歉。

acolibobj = acoLibInit acoGlobalDefs
acolibinterface: $(acolibobj).o
acoLibInit.o:
    gcc -fPIC -g -c -Wall -I/usr/include/dc1394 -o acoLibinit.o acoCommands/acoLibInterface/acoLibInit.c
acoGlobalDefs.o:
    gcc -fPIC -g -c -Wall -I/usr/include/dc1394 -o acoGlobalDefs.o acoCommands/acoLibInterface/acoGlobalDefs.c

当我运行这个makefile时,我得到:

gcc -fPIC -g -c -Wall -I/usr/include/dc1394 -o acoLibinit.o acoCommands/acoLibInterface/acoLibInit.c
cc   acoLibInit.o   -o acoLibInit
gcc: acoLibInit.o: No such file or directory
gcc: no input files
make: *** [acoLibInit] Error 1

据我所知,正在发生的事情是make正在尝试编译AND链接,即使我明确添加了-c标志。当我自己运行“gcc -fPIC -g -c ...”(来自bash)时,我根本没有遇到任何问题。为什么继续尝试“cc acoLibInit.o -o acolibInit”?

2 个答案:

答案 0 :(得分:2)

make正在尝试构建acoLibInit。它可能具有指定"whatever" can be produced by linking "whatever.o"的内置规则,这就是您获得cc行的原因。

这一行:

acolibinterface: $(acolibobj).o

扩展为:

acolibinterface: acoLibInit acoGlobalDefs.o

(注意第一个依赖项上没有.o)。这就是为什么它试图链接acoLibInit

试试这个:

acolibinterface: $(addsuffix .o,$(acolibobj))

如果您只想将.o个文件作为该目标的依赖项。

答案 1 :(得分:2)

$(acolibobj).o扩展为acoLibInit acoGlobalDefs.o。因此,你真的在​​说:

acolibinterface: acoLibInit acoGlobalDefs.o

只需定义acolibobj = acoLibInit.o acoGlobalDefs.o并使用acolibinterface: $(acolibobj)