在用实验室的服务器进行C++编译的时候,由于没有图形界面,只能在shell中进行操作,因此需要学习用gcc(g++)进行编译,如果命令多的话,就要用到makefile来完成批量的shell命令。
《跟我一起写Makefile》这个材料是自学写makefile的优秀材料。有任何问题都可以参照。
头文件不需要编译:在看《linux程序设计》的时候,已经知道了如何编译目标文件(.o)和可执行文件,那时候的头文件只有函数的声明,没有函数实体,我就盲目的认为如果头文件中有函数的实体的话那头文件也需要先生成目标文件(这种有函数实体的头文件是不规范的,但是已有的程序就是这样),对头文件(.h)的编译(生成.o)是完全错误的,没有必要做也不能做类似的工作。
不需要显式指明每个文件的头文件加载:对于手上的代码,除了C++的标准库(在标准位置),只需要添加一个fftw3f的库就可以编译成功。这些代码有若干个头文件和两个.cpp文件,实践证明ubuntu12.04和RedHat6.4的make和gcc(g++)都可以自动找寻.h的匹配,不需要显式的指明对于每个文件的.h加载。
于是makefile可以写为:
LIBPATH=-L/usr/local/lib
LIBNAME=-lfftw3f
crs:main.ostripmapimaging.o
g++ -o crs main.o stripmapimaging.o $(LIBPATH) $(LIBNAME)
#以下可省略:
main.o:*.h
g++ -c main.cpp
stripmapimaging.o:*.h
g++ -c stripmapimaging.cpp
省略了生成.o文件的命令,当然也省略了头文件的显式加载声明。
其中LIBPATH是libfftw3f.a库的路径,main.o和stripmapimaging.o分别是两个.cpp文件生成的目标文件。
在make中可以自动执行省略的部分。
只在shell中输入命令对于只有两个.cpp文件的此项目也是很简单的:
先输入
“g++ -c main.cpp stripmapimaging.cpp”
或
“g++ -c *.cpp”
生成.o文件,
再输入
“g++ -o Prog main.o stripmapimaging.o -L/usr/local/lib -lfftw3f”
或
“g++ -o Prog *.o -L/usr/local/lib -lfftw3f”
(注意要有Prog或其他生成的可执行文件名)
同样可以编译成功。
make的时候如果makefile的文件名不是makefile,调用方式为:
make -f name
要记得有-f。