记一次makefile的经历

哎呀,刚接触makefile 和 linux 不久,搞得很多C++的东西都抛诸脑后了,真的惭愧哟。

这是我的文件目录(实际开发最好不要这样命名文件,否则到之后自己都不知道这些文件都是干嘛的)
在这里插入图片描述

一开始的源代码:

.1 头文件 
#include <iostream>
using std::cout;
using std::endl;

extern int value;

void setValue(int tmp);
.1 源文件
#include "1.h"

void setValue(int tmp)
{
	value = tmp;
}
.2 头文件
#include <iostream>
using std::cout;
using std::endl;

extern int value;

void getValue();
.2 源文件
#include "2.h"

void getValue()
{
	cout << "value:" << value << endl;
}
.main 文件
#include <iostream>

#include "1.h"
#include "2.h"

int value;

int main(int argc, char** argv)
{
	setValue(100);
	getValue();
}
Makefile 文件
SRC = $(wildcard ./*.c)
OBJ = $(patsubst %.c, %.o, $(SRC))


ALL: main.out

$(OBJ): $(SRC)
	g++ -c $(SRC)

main.out: $(OBJ)
	g++ $^ -o $@

这样编译过后,直接出现了函数重定义的情况,然后看了下是在链接的时候出现的问题,怎么回事呢?再仔细看看代码,main里面包含了1和2的文件, 链接的时候,又把1和2的文件链接了一遍,所以才会出现这个问题,怎么解决呢?如果放在windows下面,很快就会反应过来,但是放在Linux下面,就是半天反应不过来,确实还是欠些火候,也是技术实力提升的一个瓶颈所在吧!下面放代码

1的头文件
#ifndef __1_H__
#define __1_H__

#include <iostream>
using std::cout;
using std::endl;

extern int value;

void setValue(int tmp);

#endif
2的头文件
#ifndef __2_H__
#define __2_H__

#include <iostream>
using std::cout;
using std::endl;

extern int value;

void getValue();

#endif

其余的文件不用改,这些是我把代码放在QT(MinGW)下面跑了一遍就反应过来了。共勉吧。

就到这里了,快过年了,提前祝大家新年快乐,心想事成,祝大家在新的一年里能够遇到心目中的TA。

原创文章 19 获赞 1 访问量 440

猜你喜欢

转载自blog.csdn.net/weixin_45718152/article/details/103686866