首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

程序员C语言快速上手——工程篇(十三)

Makefile 脚本 Makefile 脚本文件是GNU make 工具输入文件,它也包含一套自己语法规则,它也能帮助C语言实现编译和链接。...clean: rm *.o cd到当前目录,执行输入make命令,即可快速编译生成main.exe程序,当我们需要清理整个工程,即全部重新编译,可以输入make clean命令,即可删除当前目录下所有...到这里我们已经学会了cmake构建简单流程,接下来只需要学习一下 CMakeList.txt文件编写规则 基础规则 CMakeLists.txt文件由命令、注释和空格组成,其中命令是不区分大小写。...当我们需要删除临时文件,只需要删除build目录即可,不会对源码工程造成任何影响。...,然后执行make命令进行编译,完成后build目录下即生成main.exe 当链接已经编译,推荐使用find_library来查找库,因为link_directories命令传入相对路径,会直接将相对路径传给编译

2.9K30

CMake基础

,和生成各文件规则 make a.out 敲下这个命令,就可以构建出 a.out 这个可执行文件了 和直接用一个脚本写出完整构建过程相比,make 指明依赖关系好处: 1.当更新了hello.cpp...只会重新编译hello.o,而不需要main.o也重新编译一遍 2.能够自动并行地发起对hello.cpp和main.cpp编译,加快编译速度(make -j) 3.可以用通配符批量生成构建规则...,避免针对每个.cpp和.o重复写 g++ 命令(%.o: %.cpp) 但坏处也很明显: 1.make 在 Unix 类系统上是通用,但在 Windows 则不行 2.需要准确地指明每个项目之间依赖关系...,有头文件特别头疼 3.make 语法非常简单,不像 shell 或 python 可以做很多判断等 4.不同编译器有不同 flag 规则,为 g++ 准备参数可能对 MSVC 不适用...只需要把他们 include 目录或头文件下载下来,然后 include_directories(spdlog/include) 即可 缺点:函数直接实现在头文件里,没有提前编译,从而需要重复编译同样内容

1.8K20
您找到你想要的搜索结果了吗?
是的
没有找到

Makefile总结

Makefile是一个规定了怎么去编译和链接程序脚本文件,在执行make命令时会执行该文件,window环境下IDE,如visual studio已经集成了该功能,不需要关心程序编译规则,在linux...规则 目标文件:依赖文件 [Tab]系统指令1 (注意:系统指令前必须有tab) 示例 例如现有main.cpp test.cpp test.h三个文件,用Makefile实现增量编译(当其中有一个文件变化时...变量 变量在声明时赋予初值,引用变量需要在变量名前加上”$”符号,用小括号”()”或大括号”{}”把变量括起来。.../build/obj/$@ clean: $(RM) $(OBJ) $(BIN) 伪目标 有时候我们通过make指定目标来执行特定命令,这个目标不是真正文件名,称为伪目标。...并没有执行删除操作。 这种情况可以使用伪目标来解决,可避免在makefile中定义执行命令目标和当前目录下实际文件名冲突。 一旦定义为伪目标,make执行规则不会去查找隐含规则,同样也提高了效率。

91610

【Linux】《how linux work》第十五章 开发工具

大多数C程序太大了,无法合理地放在一个单独源代码文件中。 庞大文件会使程序员难以组织,而且编译器有时甚至会在解析大文件出现问题。...当你移动库文件,如果没有程序源代码,无法使用patchelf,或者你懒得重新编译可执行文件,这是一种廉价方法使程序工作。 不幸是,一分钱一分货。...(Try running make to see if you can build anything.) 一个有多个源代码文件需要奇怪编译选项程序太繁琐了,无法手动编译。...宏展开为aux.o和main.o,所以myprog依赖于这两个文件(它们必须是实际文件,因为在整个Makefile中没有这些名称目标)。...在没有Makefile情况下运行make实际上在处理Fortran、Lex或Yacc等情况最有用,因为你可能不知道编译器或实用程序工作原理。 为什么不让make试着为你找出来呢?

6310

重新编译运行C++Cuda混编项目

由于需要,最近得重新运行一个CUDA项目,但我苦于没有经验,只能从编译开始入门一下,不过还是不算难,难是原项目代码不保证质量,而且有若干无关文件,且运行环境未知、各模块运行版本也不是很清楚,导致搞了一大堆操作...具体文件内容在这里可以找到,在此做示例。...build文件夹下已经出现一众Cmake文件src文件夹 并生成了Makefile文件,这是我们接下来进行cmake保证 对于CmakeCache.txt,如果我们要重新cmake,则需要删除之.../bin/main [100%] Built target main 在make(有百分比阶段)完成后,会发现编译o文件,被link(链接)完成,最后输出可执行文件到bin目录,我们进入bin目录运行...要注意查看项目的源代码,是直接调用,还是依赖编译环境。前者需要将模块构建完成后放到项目中,而后者只需要在系统中安装相应模块,程序运行时会调用系统库。

1.5K20

Makefile文件编写

对于标签这种特性,在后续“伪目标”章节中会有叙述。 prerequisites就是,要生成那个target所需要文件或是目标。 command也就是make需要执行命令。...如果target所依赖文件也不存在,那么make会在当前文件中找依赖文件,如果找到则再根据那一个规则生成依赖文件。...典型伪目标是 Makefile 中用来清理编译过程中中间文件 clean 伪目标, 一般格式如下: .PHONY: clean <-- 这句没有也行, 但是最好加上 clean: -rm...end make[1]: Leaving directory `/path/to/test/makefile' 主 Makefile end Makefile 隐含规则 这里只列一个和编译C相关....编译C,.o 目标会自动推导为 .c # Makefile 中 main : main.o gcc -o main main.o #会自动变为: main : main.o

1.2K30

makefile终极奥义

makefile介绍 make 命令执行时,需要一个 Makefile文件,以告诉 make 命令需要怎么样编译和链接程序。...makefile 规则是: 1.如果这个工程没有编译过,那么我们所有 C 文件都要编译并被链接。 2.如果这个工程某几个 C 文件被修改,那么我们只编译被修改 C 文件,并链接目标程序。...只要我们 Makefile 写得够好,所有的这一切,我们只用一个 make 命令就可以完成,make 命令会自动智能地根据当前文件修改情况来确定哪些文件需要编译,从而自己编译需要文件和链接目标程序...进行了编译,省略了没有必要编译步骤 为什么会这样?...这个规则,并且在make时候并没有执行这个规则

1.3K30

Cmake使用

CMake可以说已经成为大部分C++开源项目标配 传统C++文件不通系统对应不通编译 比如 当添加一个文件时候需要对不通操作系统中工程进行修改 有了Cmake以后,只需要编写一个..."${CMAKE_CXX_FLAGS} -std=c++11") CMAKE_BUILD_TYPE 编译类型(Debug, Release) # 设定编译类型为debug,调试需要选择debug set...(CMAKE_BUILD_TYPE Debug) # 设定编译类型为release,发布需要选择release set(CMAKE_BUILD_TYPE Release) CMAKE_BINARY_DIR...:库文件输出存放路径 CMake编译工程 CMake目录结构:项目主目录存在一个CMakeLists.txt文件 两种方式设置编译规则: 包含源文件文件夹包含CMakeLists.txt文件,主目录...执行make命令,生成target make CMake代码实践 针对第五章写两个小项目来写对应CMakeLists.txt 最小CMake工程 # Set the minimum version

1.3K30

Linux中Makefile文件详解

all: 默认目标,执行 make 命令将会构建该目标。 $(TARGET): 目标文件生成规则,告诉 Make 如何生成最终可执行文件。...$(OBJS): 中间文件生成规则,告诉 Make 如何生成中间目标文件。 %.o: %.c: 通用规则,告诉 Make 如何将 .c 文件编译成对应 .o 文件。...clean: 清理规则,执行 make clean 将删除生成可执行文件和中间目标文件。 3. 使用 Makefile 在项目目录中,执行以下命令: 构建项目: makemake all。...当构建一个软件项目make 工具可用于自动化编译过程,确保只有发生了改变文件被重新编译。...默认规则 第一个规则通常是默认规则,即在执行 make 命令默认执行规则。在上述例子中,默认规则是 all: target1 target2。 15.

21110

Clion快速查看cpp preprocess 文件

注意:适用CMake+make,对于CMake+ninja等不适用。 对于Clion项目,编译时会生成cmake-build-debug目录,里面是cmake编译项目的产物。...# target to preprocess a source file main.cpp.i: $(MAKE) -f CMakeFiles/cppConcurrencyDemo.dir/build.make...CMakeFiles/cppConcurrencyDemo.dir/main.cpp.i 和Makefile同级,然后执行“make main.cpp.i”,就会生成对应preprocess文件。...如下图: image.png 这里来看下源文件和预处理后文件对比: 查如何生成预处理文件是因为,写modern cpp,想看下using后会不会被预处理,“gcc -E”在大项目中不实用,所以找下有没有更智能更自动化方法...CMakeFiles/cppConcurrencyDemo.dir/main.cpp.s 可以看到,通过"make main.cpp.s",我们就可以生成对应汇编文件

1.7K20

CMake使用教程和原理

一、什么是CMake CMake是一个主要用于CPP构建工具。CMake语言是平台无关中间编译工具。同一个CMake编译规则在不同系统平台构建出不同可执行构建文件。...但是,有时需要Windows端口,gmake才创建了系统。Unix编译器和Windows编译器均可与此gmake基于此系统一起使用。...image.png image.png flags.make保存了编译选项,如果编译选项改变了,也会触发重建构建 image.png 最后这些信息都会汇总成build.make image.png...比如被搜索路径下添加源文件,此时没有修改CMakeLists脚本,但是CMakeLists并不需要(没有)变化,构建系统无法察觉到新加文件,除非手动重新运行cmake,否则新添加文件就不会被编译到项目结果中...>/runtime/Cpp   LOG_CONFIGURE ON   #--Build step-----------------   # BUILD_COMMAND ${CMAKE_MAKE_PROGRAM

10.7K296

Makefile教程

语法规则如下: target:prerequisites command 其中,target为需要生成目标,prerequisites为依赖项,command为make需要执行命令(任意Shell...4.make工作流程 执行Makefile,在默认方式下,我们只输入make命令,则相当于make first_objname_in_Makefile,意思是生成出现在Makefile中第一个目标文件...但是当存在与命令名称同名目标文件,一定要使用PHONY来描述命令名,因为命令名没有依赖文件,如果同名文件始终是最新文件,那么显示make命令名,该命令永远不会被执行。...直接执行clean这个伪目标依赖命令。 (2)使用.PHONY指定伪目标可以改善性能。因为PHONY目标并非是由其它文件生成实际文件没有依赖项,make 会跳过依赖项搜索和依赖项更新检查。...原来这种是老式“双后缀规则”,编译器会自动将Makefile所在目录.cpp识别为源文件后缀,而.o识别为输出文件后缀。特别需要注意是,后缀规则不允许任何依赖文件,但也不能没有命令。

3.9K53

超清晰makefile解释、编写与示例

GNU make或是其他make程式用途就在这里:当程式有些许变动,我们需要一个程式帮助我们判断哪些需要重新编译,哪些不用;因此,撰写一个好Makefile便是相当重要能力。...main需要main.o跟foo1.o这两个目的档;如果gcc找得到这两个目的档,才会开始执行line 5命令。很不巧,gcc无法找到这两个档案(因为还没有编译过!)...main.o这个targetmake会自动找main.c来编译。...1.缺少main.omake跳到line 12进行我们所自订隐含规则进行编译:此时%.o就是main.o,%.c就是main.c。...第一个.SUFFIXES:后面没有接任何东西,表示清空suffix清单;第二个.SUFFIXES:接了.cpp .o两个副档名,告诉make需要关心这两者就好,其他不必花费心思隐含编译

4.8K80

Linux — Makefile学习笔记以及多级目录下Makefile编写

Makefile文件文件内容来执行大量编译工作,Make将只编译改动代码文件,而不用完全编译。...二、Make程序中有许多选项,其中最常用3个选项为: 1、-k:作用是在让make命令在发现错误时仍然就执行,而不是在检测到第一个错误时就停止,所以可是使用这个选项在一次操作中发下所有未编译成功文件...clean: 关于clean规则,在make clean时候,并不产生目标文件,且没有依赖文件,所以命令都会执行,但如果目录中存在名为“clean”文件或者目录,则规则没有依赖文件...此main文件并非此工程以及Makefile需要依赖文件,为在本人在测试阶段手动编译生成可执行文件main,由于疏忽没有删掉。后续操作中可以忽略此文件。...那么,在编译时候,直接在顶层目录下make即可完成所有的编译工作: 编译完成后,在看一下目录结构,多了一个目录bin: 2、如果需要跨平台编译和测试的话,可以在makefile中增加条件判断,而且为了让

4.9K10

Makefile入门

每个规则由一个目标文件、一个或多个依赖文件和一组命令组成,这些命令描述了如何从依赖文件生成目标文件。 Makefile主要作用是简化或组织编译代码过程,它可以帮助程序员自动化编译、链接和打包程序。...Makefile是一个文件,其中定义了一系列规则来指定哪些文件需要编译、哪些文件需要编译、哪些文件需要重新编译等。...如果找到,Make会按照Makefile文件规则和指令,自动执行相应命令来编译和链接源代码文件,生成可执行文件或库。...目标定义了生成目标体,并指明生成目标体需要哪些依赖文件。 依赖(Dependency):依赖是指生成目标体所需文件或另一个目标。它可以是一个或多个文件,也可以没有。...改造Makefile,目的是将mp3.c和main.c解耦,当修改mp3.c或者main.c,不需要重新编译另一个文件 # vim Makefile mq3:main.o mp3.o

9410

使用Cmake生成跨平台项目编译解决方案

这些 Make 工具遵循着不同规范和标准,所执行 Makefile 格式也千差万别。这样就带来了一个严峻问题:如果软件想跨平台,必须要保证能够在不同平台编译。...CMake就是针对上面问题所设计工具:它首先允许开发者编写一种平台无关 CMakeList.txt 文件来定制整个编译流程,然后再根据目标用户平台进一步生成所需本地化 Makefile 和工程文件...,因此新建一个文件夹,到时候需要clean时候,直接删除build即可)。     ...然后执行cmake ../     然后在build目录就会产生vs项目文件,在windows下默认是产生vs项目,如果要产生其他编译makefile,则需要使用-G指定编译器,如下:     ...在CMakeLists.txt所在目录新建build目录,在build目录执行:     cmake ../     就会在build目录生成Makefile文件,然后就可以继续执行make编译项目。

5.2K20

Linux从入门到入土③(GCC、静态与动态链接库、Git、Make、Makefile)

:gcc –E –o [目标文件] [编译文件]gcc –E [编译文件] -o [目标文件]选项“-E”可以使编译器在预处理结束停止编译选项“-o”是指定GCC输出结果。...语法格式:gcc –S –o [目标文件] [编译文件]gcc –S [编译文件] -o [目标文件]选项“-S”可以使编译器完成编译阶段就停止选项“-o”是指定GCC输出结果。...make 工具在构造项目的时候需要加载一个叫做 makefile 文件,makefile 关系到了整个工程编译规则。...拓:如果想要执行 makefile 中非第一条规则对应命令,那么就不能直接 make, 需要将那条规则目标也写到 make 后边,比如只需要执行规则 3 中命令,就需要: make b.o文件时间戳...自动推导make 是一个功能强大构建工具,虽然 make 需要根据 makefile 中指定规则来完成源文件编译

1.4K10
领券