如何编译并执行复杂的C+程序(1) wyangzw/examples/Lec2/ example22 Linux下标准的C艹+程序项目一般把源文件、头文 件、目标文件及可执行文件放在不同目录,便于维 护管理。 比如某个程序项目,为该项目建立工作目录如 example22),工作目录中一般会有bin, include,obj src等子目录,分别存放可执行文件、头文件、目 标文件和源文件。工作目录中还会有编译文件以及 其它辅助文件(如输入参数文件)。 Training] /pro jects/yangzW/examples/Lec2/example22 〉1s bin compile, sh Makefile Makefile. not, easy src build. sh include Makefile. easy ob 2021/1/29
2021/1/29 11 如何编译并执行复杂的C++程序(1) ~yangzw/examples/Lec2/example22 Linux下标准的C++程序项目一般把源文件、头文 件、目标文件及可执行文件放在不同目录,便于维 护管理。 比如某个程序项目,为该项目建立工作目录(如 example22),工作目录中一般会有bin, include, obj, src等子目录,分别存放可执行文件、头文件、目 标文件和源文件。工作目录中还会有编译文件以及 其它辅助文件(如输入参数文件)
如何编译并执行复杂的C+程序(2) wyangzw/examples/Lec2/ example22 请执行下面几个指令,复制文件、编译、运行C++的例子 cd/projects/ SUSER cp -r vyangzw/workdir/examples/Lec2/example2: / build sh编译(确保有执行权限) /bin/try执行 不要忽略".",当前目录 include目录存放头文件Ⅴ cuBoid. h, 定义了名为 VolCuboid的类 2)src目录存放源文件ex22c和 VolCuboid cc 其中ex22c主程序,它 nclude了头文件Ⅴ cuBoid. h #!/bin/sh build sh的内容 File build. sh to build example22 g++ -o bin/ex22 -Include/ src/*.cc 编译指令 输出可 要编译的 执行文件 指定头文件目录 源文件 2021/1/29
2021/1/29 12 如何编译并执行复杂的C++程序(2) ~yangzw/examples/Lec2/example22 1)include目录存放头文件VolCuboid.h, 定义了名为VolCuboid的类 2)src目录存放源文件ex22.cc和VolCuboid.cc, 其中ex22.cc为主程序,它include了头文件VolCuboid.h 请执行下面几个指令,复制文件、编译、运行C++的例子 cd /projects/$USER cp –r ~yangzw/workdir/examples/Lec2/example22 . ./build.sh 编译(确保有执行权限) ./bin/try 执行 不要忽略".",当前目录 #!/bin/sh # File build.sh to build example22 g++ -o bin/ex22 –Iinclude/ src/*.cc build.sh的内容 编译指令 输出可 执行文件 指定头文件目录 要编译的 源文件
如何编译并执行复杂的C++程序(3) wyangzW/examples/ Lec2/ example22/ Makefile #Makefile: a simple makefile default: hello 使用 Makefile hello g++-。bin/he11o-工 include/src/*,cc clean rm -f obj/*o bin/* 1. makefi1e文件的名字必须为 kefi1e, makefi1e或 GNUMakefi1e 2.注释:以#开头 3.目标:he11o,该目标被指定为默认目标 4.生成目标的命令:g++-。bin/he110 5.命令以里ab键开头!!! Projects/SUSER/example22 gmake clean清除以前编译结果(不一定需要) >cmake 编译 >bin/hello 运行 如果bin/he11o存在,且文档比源文件和头文件新,再次提交 gmake命令系统不会重新编译,节省时间 2021/1/29 13
2021/1/29 13 如何编译并执行复杂的C++程序(3) ~yangzw/examples/Lec2/example22/Makefile #Makefile: a simple makefile default: hello hello: g++ -o bin/hello -Iinclude/ src/*.cc clean: rm -f obj/*.o bin/* 1. makefile文件的名字必须为Makefile,makefile或GNUMakefile 2. 注释:以#开头 3. 目标:hello,该目标被指定为默认目标 4. 生成目标的命令:g++ -o bin/hello ..... 5. 命令以Tab键开头!!! >cd /projects/$USER/example22 >gmake clean 清除以前编译结果(不一定需要) >gmake 编译 >bin/hello 运行 如果bin/hello存在,且文档比源文件和头文件新,再次提交 gmake命令系统不会重新编译,节省时间 使用 Makefile
如何编译并执行复杂的C++程序(4) w/yangzw/examples/Lec2/ example22 /Makefile. noteasy setup control 语法很复杂,但需要改动 TOP: $(shell pwd)/ OB]: $(TOP)obj/ 的地方很少 BIN: $(TOP)bi SRC : $(TOP)src, 头文件或者库文件目录 INCLUDE:=$(TOP)include ECPPLIBS E #工 NCLUDE+= g++命令的参数 set up compilers CPP= g++ CPPFLAGS =-0-Wall-fPIC-IS(INCLUDE 可执行文件 ######### Make ey Des##### alle ex22 ex22: $(patsubst $(SRC)%oCC, $(OB)%0. o, $( wildcard $(SRC) *.cc)) s(CPP)$A $(CPPLIBS)-o $(BIN)$(notdir $@) @echo ####并######样######## 车(oB)%,0:$SRc)%cc C++后缀如所有cc改为cxx s(CPP)s(CPPFLAGS)-C $(SRC)s(notdir $<)-o $(oB)s(notdir $@) @echo PHONY: clean clean: rm-f $(oB)*o rm -f $(BIN) 备份原来的 Makefile,然后 cp -a Makefile. not easy Makefile 2021/1/29 gmake
2021/1/29 14 如何编译并执行复杂的C++程序(4) ~/yangzw/examples/Lec2/example22/Makefile.not.easy # # setup control # TOP := $(shell pwd)/ OBJ := $(TOP)obj/ BIN := $(TOP)bin/ SRC := $(TOP)src/ INCLUDE := $(TOP)include/ #CPPLIBS = #INCLUDE+= # # set up compilers # CPP = g++ CPPFLAGS = -O -Wall -fPIC -I$(INCLUDE) ####### Make Executables ##### all: ex22 ex22 : $(patsubst $(SRC)%.cc,$(OBJ)%.o,$(wildcard $(SRC)*.cc)) $(CPP) $^ $(CPPLIBS) -o $(BIN)$(notdir $@) @echo ##################### $(OBJ)%.o : $(SRC)%.cc $(CPP) $(CPPFLAGS) -c $(SRC)$(notdir $<) -o $(OBJ)$(notdir $@) @echo .PHONY:clean clean: rm -f $(OBJ)*.o rm -f $(BIN)* 语法很复杂,但需要改动 的地方很少 备份原来的Makefile,然后 cp –a Makefile.not.easy Makefile gmake 头文件或者库文件目录 g++命令的参数 可执行文件 C++后缀,如所有.cc改为.cxx
如何编译并执行复杂的C+程序(5) wyangzw/examples/Lec2/ example22 /Makefile. not easy # setup control # TOP:=$(shell pwd)/ 如果程序中调用ROO程序包 oB]: =$(TOP)obj/ 需要将ROO的 include和1ib BIN:=$〔ToP)bin/ SRC : S(TOP)src/ 加入 INCLUDE和 CPPLIBS变量 INCLUDE: S(TOP)include/ (红色和蓝色部分) ROOTCFLAGS = $(shell root-config--cflags ROOTLIBS= $(shell root-config--libs) 请在终端命令行执行下面命令, ROOTGLIBS $(shell root-config--glibs) CPPLIBS= $(ROOTLIBS)$(ROOTGLIBS) 看看效果: INCLUDE+=ROOTCFLAGS root-config--cflags #f #f set up compilers CPP= g++ root- --libs CPPFLAGS =-O-Wall-fPIC-IS (INCLUDE) root-config --glibs ###f######f Make Executables #t####### alle ex22 ex22: $(patsubst $(SRC)%o cC, $(OB])%oo,$(wildcard $(SRC)*.cc)) s(CPP)$A (CPPLIBS)-o $(BIN)$(notdir s@) @echo ###并###并###并####### S(OB])%0.0: $(SRC)%oCC $(CPP)$(CPPFLAGS)-C$(SRC)$(notdir $<)-o $(oB)s(notdir$@) @echo PHONY: clean cea271m2 $(OB])*o rm-f$(BIN)* 15
2021/1/29 15 如何编译并执行复杂的C++程序(5) ~yangzw/examples/Lec2/example22/Makefile.not.easy # # setup control # TOP := $(shell pwd)/ OBJ := $(TOP)obj/ BIN := $(TOP)bin/ SRC := $(TOP)src/ INCLUDE := $(TOP)include/ ROOTCFLAGS = $(shell root-config --cflags) ROOTLIBS = $(shell root-config --libs) ROOTGLIBS = $(shell root-config --glibs) CPPLIBS = $(ROOTLIBS) $(ROOTGLIBS) INCLUDE+=ROOTCFLAGS # # set up compilers # CPP = g++ CPPFLAGS = -O -Wall -fPIC -I$(INCLUDE) ######## Make Executables ####### all: ex22 ex22 : $(patsubst $(SRC)%.cc,$(OBJ)%.o,$(wildcard $(SRC)*.cc)) $(CPP) $^ $(CPPLIBS) -o $(BIN)$(notdir $@) @echo ##################### $(OBJ)%.o : $(SRC)%.cc $(CPP) $(CPPFLAGS) -c $(SRC)$(notdir $<) -o $(OBJ)$(notdir $@) @echo .PHONY:clean clean: rm -f $(OBJ)*.o rm -f $(BIN)* 如果程序中调用ROOT程序包 需要将ROOT的include和lib 加入INCLUDE和CPPLIBS变量 (红色和蓝色部分) 请在终端命令行执行下面命令, 看看效果: root-config --cflags root-config --libs root-config --glibs