我的makefile编译我们的C ++代码没有任何问题,但它无法创建目标文件。
如何修改此文件以便为每个.cpp
文件创建目标文件?
如果我继续而不为每个.cpp
文件创建目标文件,是否有任何问题?
我的makefile如下所示:
engine:main.cpp correlation.cpp correlation.h matcher.cpp matcher.h scheduler.cpp scheduler.h parser.cpp parser.h cache_manager.cpp cache_manager.h init.cpp init.h db_manager.cpp db_manager.h
g++ -o engine main.cpp correlation.cpp correlation.h matcher.cpp matcher.h scheduler.cpp scheduler.h parser.cpp parser.h cache_manager.cpp cache_manager.h init.cpp init.h db_manager.cpp db_manager.h -lpthread -lboost_regex -I/usr/include -ggdb \
-I/usr/include/oracle/11.1/client \
-L$(ORACLE_HOME)/lib -lclntsh -locci
clean:
rm -f engine
答案 0 :(得分:2)
如果您跳过命名目标文件,则没有问题。他们仍然会在幕后制作。
专门创建目标文件的好处是,您可以节省时间重新编译,因为 make 将能够跳过它不必重新创建的任何目标文件(因为它&&# #39;是最新的;因为它们被删除而无法使用临时文件。
最简单的方法是在makefile中使用特殊的占位符语法:
%.o: %.cpp
g++ -c -o $@ $< $(YOUR_OTHER_PARAMS)
在此示例中,您为任何以.o
结尾的文件定义通用配方,以要求以.cpp
结尾的同名文件。 $@
是一个特殊的宏,它将扩展到当前的输出文件,而$<
将包含当前的输入文件。
以类似的方式,您也可以为其他文件定义宏:
%.png: %.bmp
myinmageconverter -png $< $@
您仍然可以为特定食谱命名,例如对于一个特定文件需要其他参数或不同参数的情况。只需像往常一样在makefile中命名。占位符语法只会尝试匹配其他不匹配的目标。
如果您想提及一些通用或预编译的标头,您仍然可以包含它(就像任何其他依赖项一样):
%.o: %.cpp common.hpp
g++ -c -o $@ $< $(YOUR_OTHER_PARAMS)
对于实际的可执行文件,您可以像往常一样定义组件,即您的示例可能如下所示:
engine: main.o correlation.o matcher.o scheduler.o ...
g++ -o engine main.o correlation. matcher.o ...
%.o: %.cpp
g++ -c -o $@ $< -lpthread -lboost_regex -I/usr/include -ggdb ...