cc = gcc #最简易的makefile文件,这个可以用来进行文件之间的简易构建和链接,生成我们所需要的执行文件;prom = calc deps = $(shell find ./ -name "*.h")src = $(shell find ./ -name "*.c")obj = $(src:%.c=%.o) #将所有的.c文件替换成.o文件。 $(prom): $(obj) $(cc) -o $(prom) $(obj) %.o: %.c $(deps) $(cc) -c $< -o $@ clean: rm -rf $(obj) $(prom)
objects = main.o kbd.o command.o display.o/insert.o search.o files.o utils.oedit: $(objects) cc -o edit $(objects)main.o : defs.hkbd.o : defs.h command.hcommand.o : defs.h command.hdisplay.o : defs.h buffer.hinsert.o : defs.h buffer.hsearch.o : defs.h buffer.hfiles.o : defs.h buffer.h command.hutils.o : defs.h.PHONY : cleanclean:rm edit $(objects)#首先这个objects相当于一个宏定义来的,然后.o文件的后面可以省去.c文件,因为在makefile执行时,它是自动寻找依赖项,所以它会自动添加.c文件到.o的后面。#简单版的makefileobjects = main.o kbd.o command.o display.o/insert.o search.o files.o utils.oedit: $(objects) cc -o edit $(objects)$(objects) : defs.hkbd.o command.o files.o : command.hdisplay.o insert.o search.o files.o : buffer.h.PHONY : cleanclean:rm edit $(objects)#整个执行操作是:首先我们是根据文件的存活时间来判定的,首先.edit文件是最总的运行文件,它是最新的,.o文件时其次的执行文件,.c文件时依赖项。我们就是要通过这个makefile进行操作他们之间的关系,.c生成.o这个叫做编译(complie),再把大量的.o合成运行文件这个叫做链接(link)。#工作方式:GNU的make工作时的运行步骤入下:(想来其他的make也是相似)#1、读入全部的Makefile。#2、读入被include的其他Makefile。#3、初始化文件里的变量。#4、推导隐晦规则,并分析全部规则。#5、为全部的目标文件创建依赖关系链。#6、依据依赖关系,决定哪些目标要又一次生成。#7、运行生成命令。#规则的语法:#targets : prerequisites# command#......#或者是这样:#targets : prerequisites# command#......
#PROJECT_SOURCE_DIR目录下的Cmakefile文件#树目录如下图,首先bin是执行文件生成的地方,build是Makefile生成的地方,编写完CMakefile文件之后,就会去build目录下cmake .. make,就会生成文件,doc文件时用来存放文档的,image就是照片的地方,include是头文件,譬如自己编写的头文件main.h之类的,lib就是我们生成链接库的地方,src就是我们的源文件的地方。#PROJECT_SOURCE_DIR根目录会有一个CMakeLists.txt文件,SRC目录下面也会有一个CMakeLists.txt文件,需要我们自己分别编写;#这个是再项目根目录下的CMakeLists.txt#cmake versonCMAKE_MINIMUM_REQUIRED(VERSION 3.7.2)#project namePROJECT(main)#head file path 头文件目录#source directory 源文件目录AUX_SOURCE_DIRECTORY(src DIR_SRCS)#使用了默认的g++指定编译器SET(CMAKE_CXX_COMPILER "g++")#指定编译选项SET(CMAKE_BUILD_TYPE Debug)#指定了编译目录SET(PROJECT_BINARY_DIR ${PROJECT_SOURCE_DIR}/build)#指定了最总生成执行文件的目录SET(EXEUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)#制定了生成链接库的目录SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)#指定了包含的头文件的目录INCLUDE_DIRECTORIES( ${PROJECT_SOURCE_DIR}/include)#动态链接库或静态链接库的搜索路径,相当于指定gcc的L参数LINK_DIRECTORIES(${PROJECT_SOURCE_DIR}/lib)#添加子目录,这样就可以进入源码文件src目录可以继续构建ADD_SUBDIRECTORY(${PROJECT_SOURCE_DIR}/src)###但是遇到了一个问题就是不知道为什么生成的main是再/build/src/里面.#根目录下的SRC里面的CMakeLists.txtADD_EXECUTABLE(main main.cpp)#增加OPENCV的依赖FIND_PACKAGE(OpenCV 3.3.1 REQUIRED)#指定OPENCV的头文件包含INCLUDE_DIRECTORIES(${OpenCV_INCLUDE_DIRS})#动态链接到OPENCV的依赖库里面TARGET_LINK_LIBRARIES(main ${OpenCV_LIBS} )#指定生成的链接的地方SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)#指定执行文件生成到bin中#SET(EXECUTABLA_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)#生成静态库ADD_LIBRARY(static_demo STATIC main.cpp)SET_TARGET_PROPERTIES(static_demo PROPERTIES OUTPUT_NAME "static")#生成动态库ADD_LIBRARY(shared_demo SHARED main.cpp)SET_TARGET_PROPERTIES(shared_demo PROPERTIES OUTPUT_NAME "shared")
原文链接:http://www.cnblogs.com/chinwongleung/p/10596571.html
本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728