C ++如何将两个makefile对象目标规则(位于另一个文件夹中)组合到一个目标/规则中?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C ++如何将两个makefile对象目标规则(位于另一个文件夹中)组合到一个目标/规则中?相关的知识,希望对你有一定的参考价值。

我的C ++程序包含三个文件:

  • 两个源文件'main.cpp'和'hellolib.cpp'
  • 头文件'hellolib.h'

我正在为这个程序创建一个makefile。对于我的任务,我需要一个目标('hello')来编译可执行文件中的所有源文件。另一个目标('obj')应该将所有'.cpp'文件编译成对象,并将它们链接在一个可执行文件中。

在运行make时,我更喜欢在名为'bin'的单独文件夹中创建目标文件。源文件将位于名为“src”的文件夹中。这些文件夹是兄弟,makefile位于其父文件夹中。

我的makefile工作正常但我希望两个目标'bin / main.o'和'bin / hellolib.o'合二为一,以减少规则数量,特别是以后我处理更多源文件时。我想象替换会看起来像这样,但它似乎不起作用。

它给了我错误:“***没有规则来制作目标'bin / main.o','obj'需要。停止。

bin/%.o : src/%.cpp
    $(CC) -c $< -o $@

工作Makefile:

CC      = g++
SOURCES = ./src/main.cpp \
          ./src/hellolib.cpp
OBJECTS = ./bin/main.o \
          ./bin/hellolib.o

hello : $(SOURCES)
    $(CC) -o $@ $^

obj : $(OBJECTS)
    $(CC) -o $@ $^

bin/main.o : src/main.cpp
    $(CC) -c $< -o $@

bin/hellolib.o : src/hellolib.cpp
    $(CC) -c $< -o $@

clean:
    @rm -rf hello obj bin/*.o

main.cpp中:

#include "hellolib.h"

int main() {
    Hello h("Name");
    h.Print();
    return 0;
}

hellolib.cpp

#include "hellolib.h"

#include <iostream>

Hello::Hello(std::string name) {
    if (name.empty()) {
        cout << "Name is not valid!";
        return;
    }
    _name = name;
}

void Hello::Print() {
    cout << "Hello " << _name << endl;
}

hellolib.h

#ifndef HELLO_LIB_H
#define HELLO_LIB_H

#include <string>
using namespace std;

class Hello {
    std::string _name;
    public:
        Hello(std::string name);
        void Print();
};

#endif
答案

你需要改变:

OBJECTS = ./bin/main.o \
          ./bin/hellolib.o

至:

OBJECTS = bin/main.o \
          bin/hellolib.o

(删除主要的“./”)。要么是这样,要么改变你的模式规则以包括领先的“./”:

./bin/%.o : src/%.cpp
        $(CC) -c $< -o $@

使规则匹配使用文本匹配。它不是基于文件名,所以“./././foo”和“foo”不是一回事。

我个人建议像这样重写:

SOURCES = src/main.cpp \
          src/hellolib.cpp

OBJECTS = $(patsubst src/%.cpp,bin/%.o,$(SOURCES))

所以你只需要将文件列表保存在一个地方。

另一答案

您可以制定一个规则来构建符合特定模式的任何内容,如下所示:

bin/%.o : src/%.cpp
    $(CC) -c -o $@ $<

这将从相应的源bin/%.o编译任何src/%.cpp依赖项。

当编译C++使用CXX而不是CC(用于C代码)时,它也是标准的。

以上是关于C ++如何将两个makefile对象目标规则(位于另一个文件夹中)组合到一个目标/规则中?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Makefile (g++) 仅将一些文件链接到对象?

目标 c 中的 XCTKVOExpectation 使用示例

c++ - 如何使用make链接c ++中不同目录中的对象而不在makefile中引用它们?

C ++:如何将此指针传递给此类?

急求!!一个makefile如何生成两个可执行文件

如何将两个数组与每个元素相乘作为数字c ++