cmake(二十五)config、cmake、make区别

一    cmake命令行参数

①    D参数

+++++++++++++'传递变量(-D)'+++++++++++++

1)DCMAKE_BUILD_TYPE:设置'编译的类型'(e.g. Debug,Release)

cmake -DCMAKE_BUILD_TYPE=Debug

2)DCMAKE_C_COMPILER:设置'C编译器'(e.g. gcc,/usr/bin/gcc-7.4.0)

cmake -DCMAKE_C_COMPILER=gcc

3)DCMAKE_CXX_COMPILER:设置'C++编译器'(e.g. g++,/usr/bin/g+±7.4.0)

cmake -DCMAKE_CXX_COMPILER=g++

备注: 命令行参数'不会覆盖'CMakeLists.txt文件的'定义变量',CMakeLists.txt可以引用'${}'传递的变量

等价: CMakeLists.txt中'set (变量 变量值)'

②    P参数

备注: '-P'指定的文件'理论上'只要是'文本文件(eg:txt)'即可,最好以'cmake'结尾,要符合'cmake language'的语法

功能: -P 选项告诉cmake 运行指定脚本,但是'不生成构建流水线'--> build pipeline

二    项目的目录结构

+++++++++++++++++++

1)使用mkdir 命令新建一个project工程目录,在该目录下,再新建bin、build、lib、src、lib_self、include目录

1.5)lib_self文件夹 为lib_self'库函数源文件'所在文件夹

2)其中bin目录用来'存放编译'生成的'二进制可执行'文件

SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)

3)lib目录用来存放编译生成的'静态库'或'动态库'文件

SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)

4)build目录用来进行执行cmake命令和'存放'生成的cmake'相关'的文件 -->'编译生成的中间文件'所在的目录

4.5)include '头文件'所在位置的目录

5)src目录是用来存放'源代码'文件

6)在src目录下再分别'新建'apps、include、libs目录

备注: apps目录存放源代码文件(如.c或.cpp文件),include存放'相关的头文件',libs目录存放该源代码编译时所'需要链接'的'库文件'

三    config、cmake、make区别

①  编写程序的步骤

1)Edit: 使用'编辑器'编写源代码,如.c、.cc,.cpp等文件

2)Compile: 使用'编译器'编译源代码生成'目标文件';如.o、.a(Linux下静态库)、.so(Linux下共享库)等文件

3)Link: 使用'连接器'链接目标代码生成'可执行文件';如.exe(Window),.out(Unix)等文件

②   configure   

1)检测平台'是否安装了'对应的工具

2)根据'系统平台特性',自动生成符合'该平台的'Makefile文件

 ./configure –help

./configure –prefix=/usr  --> 对'安装'进行'控制';'默认'是/usr/local/bin

3)configure(shell)脚本'不是' UNIX/Linux世界中的*规则*;大多数时候它由'autotools生成',有时是"手动"生成的,有时是由其它'工具|语言'生成的

4)本质上就是一个'shell脚本'

备注: mysql 从'5.5开始',源代码安装将'原来的configure'改为cmake

③    cmake

示意图 from (1)

1)cmake就像'autotools'的配置步骤,它本身并'不执行构建',而是为'构建'生成'必需的文件(Makefile)'

2)调用'cmake'相当于'./configure步骤'

3)CMake有'--build'选项,但这个选项只是'调用底层构建系统',你'不能使用cmake'作为'独立'的构建工具

4)cmake是一个'跨平台'的安装(编译)工具,达到的效果-->"write once,use everywhere"

5)makefile都包含了'编译'、'安装'、'打包'过程

④    make

详细过程

1)make all:产生我们设定的目标,即此范例中的可执行文件

备注: 只打make也可以,此时会开始编译原始码,然后链接,并且产生可执行文件。

2)make clean:'清除'编译产生的可执行文件及目标文件(object file,*.o)-->make'报错'清理使用

3)make distclean:'除了'清除可执行文件和目标文件外,把configure所产生的'Makefile也清除掉'

4)make install:将程序'安装'至系统中;如果原始码'编译无误',且执行结果正确,便可以把程序'安装至系统预设'的可执行文件存放路径

备注: 如果用'bin_PROGRAMS宏'的话,程序会被安装至'/usr/local/bin'这个目录

说明: 需要有'root'权限

5)make dist:将程序和相关的档案'包装成一个压缩文件'以供发布

效果:执行完在'目录下'会产生一个以'PACKAGE-VERSION.tar.gz'为名称的文件

备注:PACKAGE和VERSION这两个变数是'根据configure.in文件'中AM_INIT_AUTOMAKE(PACKAGE,VERSION)的定义

6)make V=1

输出'详细'的编译过程

6)gcc'编译'的流程:'预处理' --> '编译' --> '汇编' --> '链接' --> '执行'

8)make test|check '预检查'

四    编译和链接

①    编译

②    链接

生成器表达式

1,ADD_DEFINITIONS
向 C/C++编译器添加-D 定义,比如:
ADD_DEFINITIONS(-DENABLE_DEBUG -DABC),参数之间用空格分割。
如果你的代码中定义了#ifdef ENABLE_DEBUG #endif,这个代码块就会生效。
如果要添加其他的编译器开关,可以通过 CMAKE_C_FLAGS 变量和 CMAKE_CXX_FLAGS 变量设置


2,ADD_DEPENDENCIES
定义 target 依赖的其他 target,'确保'在编译本 target 之前,其他的 target '已经被构建'
ADD_DEPENDENCIES(target-name depend-target1
                 depend-target2 ...)

让一个顶层目标依赖于其他的顶层目标。一个顶层目标是由命令ADD_EXECUTABLE,ADD_LIBRARY,或者ADD_CUSTOM_TARGET产生的目标。为这些命令的输出引入依赖性可以保证某个目标在其他的目标之前被构建。查看ADD_CUSTOM_TARGET和ADD_CUSTOM_COMMAND命令的DEPENDS选项,可以了解如何根据自定义规则引入文件级的依赖性。查看SET_SOURCE_FILES_PROPERTIES命令的OBJECT_DEPENDS选项,可以了解如何为目标文件引入文件级的依赖性。

命令语法:add_dependencies(target-name depend-target1 depend-target2 …)
 
命令简述:用于指定某个目标(可执行文件或者库文件)'依赖于'其他的目标。这里的'目标'必须是 'add_executable'、'add_library'、a'dd_custom_target' 命令创建的目标
+++++++++++++'安装杂谈'+++++++++++++

如何安装文件
如果你希望使用 CMAKE_INSTALL_PREFIX 来定义安装路径,就要写成相对路径,即不要以/开头,那么安装后的路径就是 ${CMAKE_INSTALL_PREFIX}/。
安装的需要有两种,一种是从代码编译后直接 make install 安装,一种是打包时的指定目录安装。
make和make install 的区别: make是在本地编译,编译所产生的文件在编译的文件夹里; make install则把编译产生的文件(如库文件,可执行文件,以及cmake指定的要安装的文件)安装到某个目录(一般是系统目录),这样其他程序就可以调用编译的这些东西了。
安装需要这个变量:CMAKE_INSTALL_PREFIX ,格式如下:cmake -DCMAKE_INSTALL_PREFIX=/usr .
即生成安装到/usr目录的make file
INSTALL一共有如下几种形式:
目标文件的安装: INSTALL(TARGETS targets... [ARCHIVE|LIBRARY|RUNTIME] [DESTINATION dirname] [PERMISSIONS permissions...] [...])
如INSTALL(TARGETS myrun mylib mystaticlib RUNTIME DESTINATION bin LIBRARY DESTINATION lib ARCHIVE DESTINATION libstatic ) 可执行二进制 myrun 安装到${CMAKE_INSTALL_PREFIX}/bin 目录
动态库 libmylib 安装到${CMAKE_INSTALL_PREFIX}/lib 目录
静态库 libmystaticlib 安装到${CMAKE_INSTALL_PREFIX}/libstatic 目录
特别注意的是你不需要关心 TARGETS 具体生成的路径,只需要写上 TARGETS 名称就可以 了。
普通文件的安装INSTALL(FILES files... DESTINATION <dir> [PERMISSIONS permissions...])
非目标文件的可执行程序安装(比如脚本之类): INSTALL(PROGRAMS files... DESTINATION <dir> [PERMISSIONS permissions...]) 脚本安装后注意设置权限为: OWNER_EXECUTE, GROUP_EXECUTE, 和 WORLD_EXECUTE,即 755 权限
目录的安装INSTALL(DIRECTORY dirs... DESTINATION <dir> [FILE_PERMISSIONS permissions...])
DIRECTORY 后面连接的是所在 Source 目录的相对路径,但务必注意: abc 和 abc/有很大的区别。 如果目录名不以/结尾,那么这个目录将被安装为目标路径下的 abc,如果目录名以/结尾, 代表将这个目录中的内容安装到目标路径,但不包括这个目录本身。
安装时CMAKE脚本的执行:INSTALL([[SCRIPT <file>] [CODE <code>]] [...])

bash -c

安装杂谈

1.gcc是GNU Compiler Collection(就是GNU编译器套件),也可以简单认为是编译器,它可以编译很多种编程语言(括C、C++、Objective-C、Fortran、Java等等)。

2.当你的程序只有一个源文件时,直接就可以用gcc命令编译它。

3.但是当你的程序包含很多个源文件时,用gcc命令逐个去编译时,你就很容易混乱而且工作量大

4.所以出现了make工具
make工具可以看成是一个智能的批处理工具,它本身并没有编译和链接的功能,而是用类似于批处理的方式—通过调用makefile文件中用户指定的命令来进行编译和链接的。

5.makefile是什么?简单的说就像一首歌的乐谱,make工具就像指挥家,指挥家根据乐谱指挥整个乐团怎么样演奏,make工具就根据makefile中的命令进行编译和链接的。

6.makefile命令中就包含了调用gcc(也可以是别的编译器)去编译某个源文件的命令。

7.makefile在一些简单的工程完全可以人工手下,但是当工程非常大的时候,手写makefile也是非常麻烦的,如果换了个平台makefile又要重新修改。

8.这时候就出现了Cmake这个工具,cmake就可以更加简单的生成makefile文件给上面那个make用。当然cmake还有其他功能,就是可以跨平台生成对应平台能用的makefile,你不用再自己去修改了。

9.可是cmake根据什么生成makefile呢?它又要根据一个叫CMakeLists.txt文件(学名:组态档)去生成makefile。

10.到最后CMakeLists.txt文件谁写啊?亲,是你自己手写的。

11.当然如果你用IDE,类似VS这些一般它都能帮你弄好了,你只需要按一下那个三角形

linux的库文件

  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值