用于 c++ 的 Makefile,带有一个 .o 文件和一个 .CPP 文件

Posted

技术标签:

【中文标题】用于 c++ 的 Makefile,带有一个 .o 文件和一个 .CPP 文件【英文标题】:Makefile for c++ with one .o file and one .CPP file 【发布时间】:2014-09-25 07:58:58 【问题描述】:

我正在尝试创建一个 makefile 来在 linux 上构建一个 windows c++ 项目。我必须在不同的目录中编译 .cpp,才能使用对象创建一个库 .so。 为此,我创建了一个脚本来查找 .cpp 并将其放入文件中:

SOURCE= \
./Source/CHAINE.CPP\
./Source/CRACKCHN.CPP\
./Source/LISTEPTR.CPP\

现在我的 makefile 看起来像:(我知道我必须更改 $(TARGET) : $(OBJECT) 规则,但我认为这不是我的问题)

-include sources.mk
OBJECT = $(SOURCE:%.CPP=%.o)
# 
$(TARGET) : $(OBJECT) 
         $(CC) $(CFLAGS) -o $@ $^ $(LIBS) 

$(OBJECT) : $(SOURCE)
         $(CC) $(CFLAG) $(PREPROC) -c $< -o $(OBJ_DIR)/$@ $(INCLUDE)

但是当我执行 make 命令时,所有对象都是使用第一个 .CPP(此处为 CHAINE.CPP)创建的:

g++ -Wall -D _MSC_VER -D _GPP -c Source/CHAINE.CPP -o ./Source/CHAINE.o 
===
g++ -Wall -D _MSC_VER -D _GPP -c Source/CHAINE.CPP -o ./Source/CRACKCHN.o
===
g++ -Wall -D _MSC_VER -D _GPP -c Source/CHAINE.CPP -o ./Source/LISTEPTR.o 

这是我第一次必须创建一个makefile,我有很多问题要解决,如果有人有解决方案?

【问题讨论】:

您想要一个.cpp.o: 规则,而不是一个明确声明您要从一个源文件生成所有目标文件的规则。 查看CMake 了解此类跨平台项目。 【参考方案1】:

$(OBJECT) 是所有对象的列表。使用最后一条规则,您似乎想告诉 Make 如何从单个 .cpp 构建单个 .o。它应该有一个 for:

%.o: %.cpp
    $(CC) $(CFLAG) $(PREPROC) -c $< -o $(OBJ_DIR)/$@ $(INCLUDE)

【讨论】:

有效!!非常感谢,我肯定已经尝试过了 :)

以上是关于用于 c++ 的 Makefile,带有一个 .o 文件和一个 .CPP 文件的主要内容,如果未能解决你的问题,请参考以下文章

C++ makefile 没有创建必要的 .o 文件

带有命令行参数的 C++ 的 Makefile 和 Bash 脚本

为 C++ 程序创建健壮的 Makefile

如何在 makefile 指令中同时包含 C 和 C++ 文件

使用 gcc 和 g++ 分别编译带有 C 和 C++ 文件的项目?

使用 cmake 编译带有 v8 库的 C++ 程序