我清理并删除所有目标文件后,下面的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
答案 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
一切都应该正常工作