我的C++生成文件无法为每个.cpp代码创建对象文件

My C++ makefile can not create object file for each .cpp code

本文关键字:文件 cpp 创建对象 代码 C++ 我的      更新时间:2023-10-16

我的makefile编译我们的C++代码没有任何问题,但它不能创建目标文件。

我需要如何修改此文件才能为每个.cpp文件创建对象文件?如果我继续不为每个.cpp文件创建对象文件,是否有任何问题?

我的生成文件如下所示:

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

如果跳过命名对象文件,则没有问题。不过,它们仍将在幕后创建。

专门创建目标文件的优点是可以节省重新编译的时间,因为make将能够跳过任何不需要重新创建的对象文件(因为它是最新的;在删除

临时文件时无法使用临时文件)。

实现此工作的最简单方法是在 makefile 中使用特殊的占位符语法:

%.o: %.cpp
    g++ -c -o $@ $< $(YOUR_OTHER_PARAMS)

在此示例中,您为任何以 .o 结尾的文件定义通用配方,以要求具有以 .cpp 结尾的同名文件。 $@是一个特殊的宏,它将扩展到当前输出文件,而$<将包括当前输入文件。

以类似的方式,您也可以为其他文件定义宏:

%.png: %.bmp
    myinmageconverter -png $< $@

您仍然可以命名特定的配方,例如,对于一个特定文件需要额外或不同参数的情况。只需像往常一样在生成文件中命名它即可。占位符语法将仅尝试匹配其他不匹配的目标。

如果你想提到一些泛型或预编译头,你仍然可以包含它(就像任何其他依赖项一样):

%.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 ...