我的C ++ makefile无法为每个.cpp代码创建目标文件

时间:2014-11-14 07:35:16

标签: c++ makefile

我的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

1 个答案:

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