C++ 如何将两个 makefile 对象目标规则(位于另一个文件夹中)合并到一个目标/规则中?
C++ How would I combine two makefile object target rules (which are located in another folder) into one target/rule?
我的C++程序由三个文件组成:
- 两个源文件"main.cpp"和"hellolib.cpp">
- 头文件 'hellolib.h'
我正在为这个程序创建一个制作文件。对于我的任务,我需要一个目标("hello"(来编译可执行文件中的所有源文件。 另一个目标('obj'(应该将所有'.cpp'文件编译成对象,并在可执行文件中将它们链接在一起。
运行make时,我更喜欢在名为"bin"的单独文件夹中创建目标文件。源文件将位于名为"src"的文件夹中。这些文件夹是同级文件夹,生成文件位于其父文件夹中。
我的 makefile 工作正常,但我希望两个将两个目标"bin/main.o"和"bin/hellolib.o"合并为一个以减少规则的数量,尤其是在以后我处理更多源文件时。 我想象替代品看起来像这样,但它似乎不起作用。
它给了我一个错误:"***没有规则或使目标'bin/main.o', "obj"需要。停。
bin/%.o : src/%.cpp
$(CC) -c $< -o $@
工作生成文件:
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
主.cpp:
#include "hellolib.h"
int main() {
Hello h("Name");
h.Print();
return 0;
}
你好.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;
}
你好
#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 $@ $<
这将编译来自相应源src/%.cpp
的任何bin/%.o
依赖项。
此外,在编译C++
时,使用CXX
而不是CC
(用于C
代码(也是标准的。
相关文章:
- 制作文件:没有规则来制定目标:如何设置正确的规则?
- antlr 规则上下文是否可以独立于目标
- C++ 如何将两个 makefile 对象目标规则(位于另一个文件夹中)合并到一个目标/规则中?
- Cassandra C++ MacOS High Sierra上的驱动程序:make:没有规则来制作目标
- 没有规则来设定目标'/usr/lib/x86_64-linux-gnu/libboost_filesystem.so'
- 没有规则来制作目标.o,为什么?
- 无需规则即可将目标设为 .moc
- 没有规则来制作目标'src/main/jni/Build.config'。停
- 制作:没有实现目标的规则 - 找不到源文件
- 没有规则来使目标"TBB_ENV_LIB_DEBUG-NOTFOUND","lib/libopencv_core.so.3.2.0"需要
- 错误“没有规则实现目标……”
- 源外生成与目标文件的规则不匹配
- 没有规则来设定目标.这是什么
- 没有要成为目标的规则:代码块
- 编译Cyanoboot:没有规则来实现目标
- 链接器命令 - 没有为第三方库设定目标的规则
- 生成文件失败,错误没有规则来设定目标
- EclipseCDT:没有使目标全部成为目标的规则
- make:没有规则来设定目标.日食错误
- GNU Make -在规则/目标中设置shell命令输出中的MAKEFILE变量