Makefile
Posted gangyin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Makefile相关的知识,希望对你有一定的参考价值。
这段时间在用C++写全遍历路径规划算法,一开始图省事,从头到尾都写在一个源文件中,接近250行了。这样每次调试的时候都得面对堆积的代码,思路很不清晰,于是决定拆分成多个文件。
查阅资料后,打算用Makefile来管理我的项目,因为我的项目不算太大,CMAKE有点大材小用。下了一本电子书《Mangning Projects with GNU Make》,当作参考。
使用后发现偷懒果然会带动生产力。把Makefile文件放在src文件夹中,运行make命令,提示没把opencv.pc加入PKG-CONFIG-PATH环境变量中,去StarkOverFlow搜索后解决问题。
src=$(wildcard ./*.cc) obj=$(patsubst %.cc, %.o,$(src)) target=ccpp CC=g++ CCFLAGS += -c -Wall $(shell pkg-config --cflags opencv) LDFLAGS += $(shell pkg-config --libs --static opencv) $(target):$(obj) $(CC) $(obj) -o $(target) $(LDFLAGS) %.o: %.cc $(CC) -c $< -o $@ $(CCFLAGS) .PHONY: clean clean: rm -rf $(obj) $(target)
接着把不同功能的代码段拆分成不同的源文件,只在main.cc中按顺序运行几个函数,函数的具体执行就交给其他的源文件了。为项目的推进搭好坚实的地基。
再次运行make命令,报错:全局变量被多次定义。看来是我把全局变量定义在头文件中了!
翻看《C程序设计语言》,4.4节作用域规则。如果要在外部变量的定义之前使用该变量,或者外部变量的定义与变量的使用不在同一个源文件中,则必须在相应的变量声明中强制的使用关键字extern。在一个源程序的所有源文件中,一个外部变量只能在某个文件中定义一次,而其他文件可以通过extern声明来访问它。
4.5头文件(该小节对我今天的代码优化有很大启发!TODO:我的代码还有很大的优化空间!)
“此外,还必须考虑定义和声明在这些文件之间的共享问题。我们尽可能把共享的部分集中在一起,这样就只需要一个副本,改进程序时也容易保证程序的正确性。我们把这些公共部分放在头文件calc.h中,在需要时通过#include指令包含进来。
以上是关于Makefile的主要内容,如果未能解决你的问题,请参考以下文章
MakefileMakefile 中 LINUXINCLUDE 的作用
MakefileMakefile 中 LINUXINCLUDE 的作用