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.o edit: $(objects) cc -o edit $(objects) main.o : defs.h kbd.o : defs.h command.h command.o : defs.h command.h display.o : defs.h buffer.h insert.o : defs.h buffer.h search.o : defs.h buffer.h files.o : defs.h buffer.h command.h utils.o : defs.h .PHONY : clean clean: rm edit $(objects) #首先这个objects相当于一个宏定义来的,然后.o文件的后面可以省去.c文件,因为在makefile执行时,它是自动寻找依赖项,所以它会自动添加.c文件到.o的后面。 #简单版的makefile objects = main.o kbd.o command.o display.o/ insert.o search.o files.o utils.o edit: $(objects) cc -o edit $(objects) $(objects) : defs.h kbd.o command.o files.o : command.h display.o insert.o search.o files.o : buffer.h .PHONY : clean clean: 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 verson CMAKE_MINIMUM_REQUIRED(VERSION 3.7.2) #project name PROJECT(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.txt ADD_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")
原文:https://www.cnblogs.com/chinwongleung/p/10596571.html