制作:错误编译.o

时间:2014-10-13 08:17:55

标签: makefile

我清理并删除所有目标文件后,下面的makefile工作,但是如果我编辑源文件然后再次运行make,它会输出以下错误。我相信这是来自以下几点:

 %.o: %.cpp
    $(CXX) -c $(CFLAGS) $< -o $@

我以为我对自动变量有了基本的把握,但有些事情是不对的。

生成文件:

all: main

CFLAGS=-fPIC -g -Wall  `pkg-config --cflags opencv` -I /usr/local/include/libusb-1.0/ 
LIBS = `pkg-config --libs opencv`
INCLUDE = -I /usr/local/include/libfreenect
FREE_LIBS = -L/usr/local/lib -lfreenect

main: device.cpp cups.cpp main.cpp 
    $(CXX) $(INCLUDE) $(CFLAGS) $? -o $@ $(LIBS) $(FREE_LIBS) 

%.o: %.cpp
    $(CXX) -c $(CFLAGS) $< -o $@

clean:
    rm -rf *.o main

make的输出:

Undefined symbols for architecture x86_64:
  "_main", referenced from:
     implicit entry/start for main executable
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [main] Error 1

2 个答案:

答案 0 :(得分:2)

在第

$(CXX) $(INCLUDE) $(CFLAGS) $? -o $@ $(LIBS) $(FREE_LIBS)

您使用$?,这意味着命令中只会使用更新的依赖项。 (您应该在命令中看到这一点。)

请改用$+。 (参见manual。)

(PS:这是答案的一半;另一半是Sagar Sakre的建议。)

答案 1 :(得分:1)

main taget应该依赖.o个文件而不是.cpp

更改

main: device.cpp cups.cpp main.cpp

main: device.o cups.o main.o

一切都应该正常工作