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

浅析Makefile、make、cmake

使用gcc命令编译你会遇到一些麻烦: 对于c语言,使用gcc编译时候,其实它只会默认帮你链接一些基本c语言标准(例如libc.a或者libc.so),有很多依赖(例如非标准、第三方等)是需要我们手动链接...只需要把所有源文件读入就行,所以后面又出现了另一个工具,可以跨平台项目管理工具cmakecmake就可以生成Makefile文件给make去执行,这样就不用跨平台了还得去修改。...cmake它仍然是目标、依赖之类抽象东西,在Linux下,它会生成linux下Makefile,在windows下,假如使用visual studio,它会生成visual studio使用工程文件...这时候一个疑问又产生了,cmake是怎么生成Makefile?...其实cmake又是根据一个叫CMakeLists.txt文件生成Makefile,就是make是用来执行Makefilecmake是用来执行CMakeLists.txt

85820

Makefile目标

1、Makefile目标的格式: .PHONY : clean clean:     rm xxxx 2、Makefile目标的作用: 第一种情况: 如果我们需要书写这样一个规则:规则所定义命令不是去创建目标文件...当文件夹中没有clean这个文件时候,我们输入“make clean”能按照初衷执行,但是一旦文件夹中出现clean文件,我们再次输入“make clean”,由于这个规则没有任何依赖文件,所以目标被认为是最新而不去执行规则所定义命令...为了解决问题,我们将目标clean定义成伪目标。...clean:   rm xxxx 如果同一个目录下有一个clean文件,那么  make clean动作将不会执行rm动作; 所以,增加.PHONY伪目标的使用的话,就会忽略目录下clean这个文件,...直接执行rm动作; 第二种情况: 伪目标的另一种使用场合时在make并行和递归执行过程中。

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

cmake:shell(bat,sh) 脚本方式生成Makefile

https://blog.csdn.net/10km/article/details/50444643 项目总体是用ant来控制编译,但有一些用c/c++写native动态链接是用...cmake来生成Makefile文件编译,为了统一用ant来控制所有代码生成,就需要c/c++代码也能用ant脚本编译。...总体过程是这样: 步骤1.为了让ant能控制c/c++代码编译,首先就需将cmake生成Makefile过程脚本化。...实现Makefile编译》 步骤1 因为项目的设计是跨平台,所以需要在windows和linux下分别实现不同脚本 linux sh脚本实现,newprj.sh: #!...两个版本编译器共存,所以 这里首先就要检测编译器版本,指定合适编译器,参见我另一篇博文《cmake 生成Makefile时指定c/c++编译器》。

1.9K10

makefile中伪目标的理解

我们知道Makefile语法是这样: target ... : prerequisites ... command … … 2....前两个都会生成目标,而第三个不会生成目标,仅仅希望执行所在规则(clean)定义命令(rm)。 这个时候就需要伪目标出马了:目的不是为了生成目标,仅仅是希望执行其所在规则定义后面的命令。 3....*.o 就像上面这样,多一个 .PHONY声明,那么clean就是伪目标了 4....为什么要使用伪目标: 1)避免在我们Makefile中定义只执行命令目标和工作目录下实际文件名字出现冲突。...(比如,假如当前目录有一个clean文件,那么上面的 make clean 就不能达到我们预期了) 2)提高执行效率,被声明为伪目标后,make在执行此规则时不会视图去查找隐含规则来创建这个目标

1.5K80

CMakeCMake 引入 ( Android Studio 创建 Native C++ 工程 | CC++ 源码编译过程 | Makefile 工具 | CMake 引入 )

文章目录 一、在 Android Studio 中创建 Native C++ 工程 二、C/C++ 源码编译过程 三、Makefile 工具 四、CMake 引入 该系列博客应用场景是 Android...cpp 目录下 native-lib.cpp ; 如果将该 native-lib.cpp 源码打包成 Kotlin 或 Java 中通过 JNI 可调用 so 动态 , 需要使用 Make 工具进行编译...的当前目录 , 执行 make 命令 , 会自动执行 Makefile 脚本中编译命令 ; 四、CMake 引入 Makefile 在 Linux 下有其固定编写格式 , 在 Windows 下有另外一种编写格式..., 不同平台 Makefile 编写格式都不同 , 非常不利于跨平台 ; CMake 解决了上述 Makefile 跨平台问题 , 使用 CMake 可以完美处理在不同平台之间 Makefile...不兼容问题 ; CMake 可以生成不同平台 Makefile 文件 ;

85600

cmake 生成Makefile时指定cc++编译器

https://blog.csdn.net/10km/article/details/50444715 linux下在使用cmake生成Makefile时候,如果不指定编译器,则默认是使用系统原生编译器..., 当操作系统中安装了新版本编译器,多个版本编译器共存时候,如果想使用新版本编译器,在cmake生成Makefile时候就需要指定编译器。...不论环境变量$PATH怎么设置,cmake在生成Makefile时,如果不指定编译器,生成Makefile都会调用/usr/bin下g++/gcc。 所以这种情况下必须指定编译器。...cmake-gui 用cmake-gui配置Makefile时候如下操作: 这时不能选择默认第一项(Use default native compilers),而是要选择第二项(Specify...在这里填写指定c/c++编译器路径 ? shell脚本 那么如果要在脚本中调用cmake生成Makefile时,应该如何写脚本呢? #!

6.9K10

CMake vs Makefile: 如何选择适合你项目构建工具

在软件开发中,构建(build)是一个非常重要过程。我们需要将源代码转换为可执行文件或文件。为了完成此过程,我们通常使用构建工具来自动化构建过程。...---- 可扩展性 CMake支持插件,可以轻松地添加新构建目标和生成器。这意味着,开发人员可以根据需要定制CMake行为。...相比之下,Makefile需要手动编写新规则和目标,因此,如果您需要一个更加灵活和可定制构建工具,那么CMake是更好选择。...---- 构建速度 CMake构建速度比Makefile要快,因为CMake在生成Makefile之前会对源代码进行处理,从而避免了很多重复工作。...---- 总结 以下是一些选择CMakeMakefile考虑因素: 跨平台支持:如果您需要在不同操作系统上构建项目,则CMake是更好选择,因为它可以自动生成适合不同平台Makefile

32900

make makefile cmake qmake都是什么,有什么区别?

其基本语法是: 目标+依赖+命令,只有在目标文件不存在,或目标比依赖文件更旧,命令才会被执行。由此可见,Makefile和make可适用于任意工作,不限于编程。比如,可以用来管理latex。...虽然,仍然是目标,依赖之类东西,但更为抽象和友好,比如你可用math表示数学,而不需要再具体指定到底是math.dll还是libmath.so,在windows下它会支持生成visual studio...当然cmake还有其他功能,就是可以跨平台生成对应平台能用makefile,你不用再自己去修改了。 9.可是cmake根据什么生成makefile呢?...简单说就是C++第三方,使用这个你可以很容易生成windows,Linux,MAC os等等平台图形界面。...现在Qt还包含了开发各种软件一般需要用到功能模块(网络,数据,XML,多线程啊等等),比你直接用C++(只带标准内裤那种)要方便和简单。

2.1K10

CMake 静态与动态构建

在前面一篇文章写了如何使用CMake编译“hello world”。这一篇写写构建静态和动态。...上一文章链接:《CMake,大型项目采用构建工具》 对于静态和动态了解,可以看看之前文章: 静态:《静态链接实现》 动态:《动态链接实现》 在上一篇文章中,我们说了内部构建和外部构建区别...rice.c) ADD_LIBRARY(rice STATIC ${LIBRICE_SRC}) 制作工程模板制作好后,进行编译,在build目录下进行编译,如下: $ cmake .....$ cd lib $ ls CMakeFiles cmake_install.cmake librice.a Makefile $ 编译完,在lib目录下生成了librice.a这个静态。...EXCLUDE_FROM_ALL,参数意思是这个不会被默认构建,除非有其他组件依赖或者手工构建。 根据ADD_LIBRARY指令描述,在上面的例子中,很清楚理解是生成静态操作。

1.6K20

Makefile】简单Makefile编写

(链接目标程序) 只要我们Makefile够好,我们只用一个make命令就可以完成,make命令会自动智能地根据当前文件修改情况来确定哪些文件需要重新编译,从而自己编译需要文件和链接生成可执行文件...Makefile规则: target … :prerequisites… command … … target是一个目标文件,可以是Object File,也可以是可执行文件。...这就是Makefile规则,也就是Makefile中最核心内容。...如果目标文件(target)不存在,或是target后依赖.o文件文件修改时间要比目标文件新,那么,它就会执行后面所定义命令来重新生成目标文件。...所以,为了makefile易维护,在makefile中我们可以使用变量。makefile变量也就是一个字符串。可以理解为C语言中宏。

94310

Linux 编译动态_makefile编译动态

大家好,又见面了,我是你们朋友全栈君。 1. 动态链接简介 动态又叫动态链接,是程序运行时候加载,当动态链接正确安装后,所有的程序都可以使用动态来运行程序。...动态目标文件集合,目标文件在动态组织方式是按特殊方式组织形成。在动态中函数和变量地址是相对地址而不是绝对地址,其真实地址在调用动态程序加载时形成。...使用动态链接 在编译程序时候,使用动态链接和静态链接是一致, 使用“-l名”形式,编译器在生成可执行文件时候会链接该链接文件。..../ -lstr -L : 指定链接动态路径 -lstr : 制定链接动态名称 这里需要注意是: 编译链接动态和运行动态链接并不一致。...运行时动态链接需要放到系统搜索路径下。 6. 动态加载使用 动态加载和动态链接不同是, 一般动态链接需要在程序启动时候就要寻找动态链接,找到库函数。

6K20

CMake和静态顺序

前言 C/C++程序许多同学被静态依赖折腾,因为默认情况下要求被依赖放在依赖它后面,当一个程序或共享依赖静态较多时,可能会陷入解决链接问题坑中。...但也可以偷懒,不关心静态顺序问题,ld为此提供了start-group和end-group两个选项,让包含在这两者间静态顺序可以随意。...方法 以CMake为例,假设程序x依赖三个静态:libX1.a、libX2.a和libX3.a,而libX2.a又依赖libX1.a,libX3.a依赖libX2.a和libX1.a,正常情况下...,--start-group libX2.a libX1.a libX3.a -Wl,--end-group 附1:链接静态顺序问题 在链接静态时,如果多个静态之间存在依赖关系,则有依赖关系静态之间存在顺序问题...中b() return 0; } 对应Makefile文件: all: x liba.a: a.o libb.a: b.o x: x.o liba.a libb.a # 问题出在这儿 g++

6.4K50
领券