欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

记一次makefile的经历

程序员文章站 2022-06-01 20:23:09
...

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

这是我的文件目录(实际开发最好不要这样命名文件,否则到之后自己都不知道这些文件都是干嘛的)
记一次makefile的经历

一开始的源代码:

.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 [email protected]

这样编译过后,直接出现了函数重定义的情况,然后看了下是在链接的时候出现的问题,怎么回事呢?再仔细看看代码,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。

相关标签: makefile linux