前言Linux->项目管理(目录结构)Object(目录):DataBase(目录):数据库操作Core(目录):项目核心代码DateData(目录):基本业务逻辑Inter(目录):网络部分的代码.....假设每个目录下有100个.c文件gcc-omain如果此时需要编译所有的.c文件,那么使用gcc是很不方便的。而且,编译一大堆后,如果要修改其中一个文件,就得把这个拉回来,重新编译MakefileMakefile《跟我一起写Makefile》makefile最直观的好处:只需要一个make命令,新创建的makefile是完全自动编译的,使用了一个相当于gcc的集合,把gcc的操作写在makefile文件里,更有条理[root@localhost2020-03-09]#vimmakefile[root@localhost2020-03-09]#lsadd.cdiv.cmain.cmakefilemux.cmy_math.hsub.c[root@localhost2020-03-09]#make[root@localhost2020-03-09]#lsadd.cdiv.cmainmain.omux.cmy_math.hsub.oadd.odiv.omain.cmakefilemux.osub.c[root@localhost2020-03-09]#./maina+b=32a-b=8a*b=240a/b=1.666667[root@localhost2020-03-09]#makecleanrm*.omain[root@localhost2020-03-09]#lsadd.cdiv.cmain.cmakefilemux.cmy_math.hsub.c/*makefileinternal*/main:main.o添加。odiv.osub.omux.ogcc-omainmain.oadd.odiv.osub.omux.omain.o:main.cgcc-cmain.cadd.o:add.cgcc-c添加。cmux.o:mux.cgcc-cmux.csub.o:sub.cgcc-csub.cdiv.o:div.cgcc-cdiv.cclean:rm*.omainrestofcode/*add.c*/#include"./my_math.h"intmy_add(inta,intb){returna+b;}/*div.c*/#include"./my_math.h"#include//printf#include//Existenceendexit(0)doublemy_div(inta,intb){if(b==0){printf("error");退出(0);}return(a*1.0)/b;}/*my_math.h*/#ifndef_MY_MATH_H#define_MY_MATH_Hintmy_add(int,int);intmy_sub(int,int);intmy_mux(int,int);doublemy_div(整数,整数);#endif假设两个主要函数共享一些文件并创建一个新的.c文件run.c/*run.c*/#include"./my_math.h"#include#includeintmain(){printf("helloL%d",my_div(100,34)-my_add(1,20));}/*makefile*/all:mainrunrun:run.oadd.odiv.ogcc-orunrun.oadd.odiv.omain:main.oadd.odiv.osub.omux.ogcc-omainmain.oadd.odiv.osub.omux.oadd。o:add.cgcc-cadd.cmux.o:mux.cgcc-cmux.csub.o:sub.cgcc-csub.cdiv.o:div.cgcc-cdiv.cmain.o:main.cgcc-cmain.crun.o:run.cgcc-crun.cclean:rm*.omainmakefile简化编写编译语句,编译器会自动推导出/*makefile*/main:main.oadd.odiv.osub.omux.oadd.o:add.cmux.o:mux.csub.o:sub.cdiv.o:div.cmain.o:main.cclean:rm*.omain默认cc编译器[root@localhost2020-03-09]#makecc-c-omain.omain.ccc-c-oadd.oadd.ccc-c-odiv.odiv.ccc-c-osub.osub.ccc-c-omux.omux.cccmain.oadd.odiv.osub.omux.o-omainforce使用gcc/g++编译头加上CC=gcc/*makefile*/CC=g++main:main.oadd.odiv.osub.omux.oadd.o:add.cmux.o:mux.csub.o:sub.cdiv.o:div.cmain.o:main.cclean:rm*.omain进一步简化makefileCC=g++main:main.oadd.odiv.osub.omux.omain.oadd.omux.odiv.osub.o:clean:rm*.omain极简makefile编写?CC=g++file=main.oadd.omux.odiv.osub.omain:$(file)$(file):clean:rm*.omain在不同目录下[root@localhost2020-03-09]#tree.├──main.c├──makefile├──Math│├──add.c│├──div.c│├──mux.c│└──sub.c└──my_math.hVPATH:./Mathfirstin在当前目录下搜索,然后到Math目录下搜索main.c头文件"./Mathmy_math.h"CC=g++file=main.oadd.omux.odiv.osub.oVPATH=.:./Mathmain:$(file)$(file):clean:rm*.omain为了防止中间文件生成过多,执行cleanobjCC=g++file=main.oadd.o执行后mainmux.odiv.osub.oVPATH=.:./Mathall:maincleanobjmain:$(file)$(file):clean:rm*.omaincleanobj:rm*.olibraryfilelibraryfile:用户编写的程序是整体打包的。其他模块或用户使用时,只需要这个库文件即可。OKlibc.so-->stdio.hstring.hmath.hrand.htime.hlibstdc++.so-->STL静态库windows:.libLinux:.ageneration-使用步骤生成:1.编译所有源码(excludingmain)filesintointermediatefiles(.o)2.使用命令arcrvlibxxx.a*.ogcc-c*.carcrvlibxxxxx.a*.o//注意*.o会将所有.o文件打包成thelibrary//请确保当前文件夹下的.o文件都是你需要使用的:gcc-omainmain.c-L库路径-l库名//如果没有给出库路径,会去搜索/lib或/usr/libgcc的默认路径-omainmain.c-L./Math-lMyMathName参考代码[root@izm5eb8f6yfdzvy9a9acbfz2020-03-09]#lsmainmain.cmakefileMath[root@izm5eb8f6yfdzvy9a9acbfz2020-03-09]#cdMath[root@izm5eb8f6yfdzvy9a9acbfzMath]#sublsadd.cdiv.cmux.hroot@izm5eb8f6yfdzvy9a9acbfzMath]#gcc-c*.c[root@izm5eb8f6yfdzvy9a9acbfzMath]#lsadd.cdiv.cmux.cmy_math.hsub.oadd.odiv.omux.osub.c[root@izm5eb8f6yfdzvy9a9acbfzMath]#arcrvlibMyMathName。a*.oa-add.oa-div.oa-mux.oa-sub.o[root@localhostMath]#lsadd.cdiv.clibMyMathName.amux.osub.cadd.odiv.omux.cmy_math.hsub.o[root@localhostMath]#cd..[root@localhost2020-03-09]#lsmain.cmakefileMath[root@localhost2020-03-09]#gcc-omainmain.c/tmp/ccmTewMT.o:在函数`main'中:main.c:(.text+0x21):未定义引用`my_add'main.c:(.text+0x41):未定义引用`my_sub'main.c:(.text+0x61):未定义引用`my_mux'main.c:(.text+0x81):未定义引用`my_div'collect2:error:ldreturned1exitstatus[root@localhost2020-03-09]#gcc-omainmain.c-L./Math-lMyMathName[root@localhost2020-03-09]#lsmainmain.cmakefileMath[root@localhost2020-03-09]#./maina+b=32a-b=8a*b=240a/b=1.666667共享库(动态库)windows:.dllLinux:.sogenerate-use-executestepgenerategcc-shared-fPIC-olibxxxxxx.so所有函数代码的源代码[root@localhostMath]#lsadd.cdiv.clibMyMathName.amux.cmy_math.hsub.c[root@localhostMath]#gcc-shared-fPIC-olibActiveMathName.so*.c[root@localhostMath]#lsadd.clibActiveMathName.somux.csub.cdiv.clibMyMathName.amy_math.h使用gcc-omainmain.c-L库路径-l库名gcc-omainmain.c-L./Math-lActiveMathName[root@izm5eb8f6yfdzvy9a9acbf动态库使用后,已经在main中了,但是执行的时候,您必须指定库所在的路径。默认路径:/lib/usr/lib通过环境变量设置系统加载动态库的搜索路径:LD_LIBRARY_PATHexportLD_LIBRARY_PATH=.os所在路径[root@locaohost2020-03-09]#./main./main:加载共享库时出错:libActiveMathName.so:无法打开共享对象文件:没有这样的文件或目录[root@locaohost2020-03-09]#lsmainmain.cmakefileMath[root@locaohost2020-03-09]#cdMath[root@locaohostMath]#pwd/home/Akuaner/2020-03-09/Math[root@locaohostMath]#exportLD_LIBRARY_PATH=/home/Akuaner/2020-03-09/Math[root@locaohost垫h]#echo$LD_LIBRARY_PATH/home/Akuaner/2020-03-09/Math[root@locaohostMath]#cd..[root@locaohost2020-03-09]#./maina+b=32a-b=8a*b=240a/b=1.666667exportLD_LIBRARY_PATH=这个命令是临时的,如果想永久修改路径,可以添加到home目录下的.bashrc文件中(~)