IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发工具 -> Command——CMake -> 正文阅读

[开发工具]Command——CMake

常用命令解释

下面用的是 C 语言的注释,实际编写 CMakeLists.txt 时不要把注释也写上了。

1.PROJECT 关键字
		用来指定工程的名字和支持的语言,默认支持所有语言。
		PROJECT(HELLO)			//指定了工程的名字,并且按默认支持所有语言
		PROJECT(HELLO CXX)		//指定了工程的名字,并且支持语言是C++
		PROJECT(HELLO C CXX) 	//指定了工程的名字,并且支持语言是 C和C++

2.SET 关键字
		用来显示的指定变量的
		SET(SRC_LIST hello.c)    //SRC_LIST 变量包含了 hello.c
		SET(SRC_LIST1 1.c 2.c 3.c) //多个包含就这样写,中间用空格隔开

3.MESSAGE 关键字
		向终端输出用户自定义信息
		主要包含三种:
			SEND_ERROR 		//产生错误,生成过程被跳过
			STATUS			//输出前缀为--的信息。 eg: ---- This is BINARY dir/home/pl/Desktop/LinuxCode/CMake/simpledemo
			FATAL_ERROR		//立即终止所有 cmake 过程

4.ADD_EXECUTABLE 关键字
		生成可执行文件
		ADD_EXECUTABLE(hello ${SRC_LIST})		//生成的可执行文件名为 hello,源文件读取变量 SRC_LIST 中的内容。
				//也可以直接把 SRC_LIST 中的文件,直接写过来,而不用SRC_LIST变量。
		PROJECT(HELLO)中指定是工程文件名,和这个生成的可执行文件名 hello 没有任何关系。

5.ADD_SUBDIRECTORY 关键字
		用于向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制存放的位置,语法如下:
		ADD_SUBDIRECTORY(source_dir [binary_dir][EXCLUDE_FROM_ALL])
			EXCLUDE_FROM_ALL函数是将写的目录从编译中排除,
		ADD_SUBDURECTORY(src bin)
			将 src子目录加入工程,并指定编译输出(包含编译中间结果)路径为 bin目录
			如果不进行 bin目录指定,那么编译结果(包含编译中间结果)都将存放在 build/src目录
		

6.更改二进制的保存路径
		SET 指定重新定义 EXECUTABLE_OUTPUT_PATH 和 LIBRARY_OUTPUT_PATH 变量 来指定最终的目标二进制的位置
		SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
		SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)

7.项目工程一般拥有的文件或文件夹
		build			//项目编译文件夹
		COPYRIGHT		//项目版权文件
		doc				//项目相关文档文件夹
		README			//基础教程文件
		runhello.sh 	//项目安装的脚本
		src 			//项目源文件文件夹



8.INSTALL 关键字	//用于安装 工程相关文件
		
		INSTALL(FILES COPYRIGHT README DESTINATION testcmake/install/cmake/)	//安装 项目工程相关文件
		INSTALL(PROGRAMS runhello.sh DESTINATION testcmake/install/cmake/bin)	//安装项目工程相关 可执行程序
		INSTALL(DIRECTORY doc/ DESTINATION testcmake/install/cmake/doc)			//安装项目工程相关 文件夹下所有内容
				FILES		:指定要安装的文件名
				DESTINATION :指定目标安装路径 
							  路径有两种:
								 1)相对路径
										实际为 ${CMAKE_INSTALL_PREFIX}/<DESTINATION>
										CMAKE_INSTALL_PREFIX	默认为 /usr/local/					
										cmake -DCMAKE_INSTALL_PREFIX = /usr //在cmake的时候指定CMAKE_INSTALL_PREFIX 变量的路径
								 2)绝对路径
										推荐这个,不容器出错。
										
				PROGRAMS 	:非目标文件的可执行程序安装(比如脚本之类)
				DIRECTORY 	:指定要安装的文件夹下的所有内容
								注意 doc/ //:代表将doc文件夹下的内容安装到 目标安装路径
									doc //:代表将目录名 doc 安装到目标安装路径

9.安装方法: 
		1)从代码编译后直接make install //就跟安装cmake时的方法是一样的,
					路径由上面INSTALL 关键字在CMakeLists.txt中指定。
		2)安装时时指定目录安装:
		   			简单:	make install DESTDIR=/tmp/test
		   			复杂:	./configure -prefix=/usr

10.静态库和动态库
		静态库:扩展名一般为".a"".lib"
				在编译时会直接整合到目标程序中,编译成功的可执行文件独立运行。
		动态库:扩展名一般为".so"".dll"
				在编译时不会放到连接的目标程序中,即可执行文件不能独立运行。
		

11.ADD_LIBRARY 关键字
		用来生成 库文件
		ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})
			hello			:正常的库名,生成的 名字前面会【自动加上 lib】, 最终产生的文件为 libhello.so
			SHARED			:动态库 
			STATIC			:静态库
			${LIBHELLO_SRC}	:变量,指代源文件

12.SET_TARGET_PROPERTIES	关键字
		这条指令可以用来设置输出的名称,使用方法看 13.
		对于动态库,还可以指定动态库版本和 API版本:
				SET_TARGET_PROPERTIES(hello PROPERTIES VERSION 1.2 SOVERSION 1)
						VERSION :指代动态库版本
						SOVERSION:指代API版本

				
13.同时构建同名的静态库和动态库
		SET(SRC_LIST 1.c 2.c 3.c)
		ADD_LIBRARY(hello_static STATIC  ${SRC_LIST})
		SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME "hello")		//对hello_static 重命名为 hello
		SET_TARGET_PROPERTIES(hello_static PROPERTIES CLEAN_DIRECT_OUTPUT 1)	//cmake在构建新的target时 会尝试清掉其他使用这个名字的库, 在构建下面 libhello.so时 会清理掉 libhello.a
		
		ADD_LIBRARY(hello_so SHARED ${SRC_LIST})
		SET_TARGET_PROPERTIES(hello_so PROPERTIES OUTPUT_NAME "hello")	
		SET_TARGET_PROPERTIES(hello_so PROPERTIES CLEAN_DIRECT_OUTPUT 1)


14.安指定共享库和头文件安装位置
		其实就是将头文件安装到lib 或 lib64 文件夹。
		INSTALL(FILES hello.h DESTINATION /usr/include/hello)										//安装头文件,DESTINATION 后跟绝对路径
	 	INSTALL(TARGETS hello hello_static LIBRARY DESTINATION /usr/lib ARCHIVE DESTINATION /usr/lib)		//安装动态库和静态库文件到 lib位置
				

15.指定引用头文件位置 和 静动态库文件位置
		一般默认把头文件安装到 /usr/include/ 文件夹下
		如果安装到其他文件夹下,那就应该使用如下命令在使用cmake编译时包含该路径,包含方法如下:
			INCLUDE_DIRECTORIES(/usr/include/hello)				//包含头文件方法  这个一定在 ADD_EXECUTABLE() 之前
			TARGET_LINK_LIBRARIES(test /usr/lib/libhello.so)	//包含 动、静态库文件,这个一定在 ADD_EXECUTABLE() 之后

										 
99.CMake自带的变量
		<projectname>_BINARY_DIR	//指向该工程二进制编译所在目录
		<projectname>_SOURCE_DIR	//指向该工程源文件所在目录


100.基本语法规则
		1)变量的使用:① ${}  方式取值
				     ② IF 控制语句中直接使用变量名
		2)指定多个参数时,用 空格或分号 分开   eg:ADD_EXECUTABLE(hello 1.c 2.c 3.c)
		3)指令 是大小写无关的,参数和变量 是大小写相关的。 推荐全部大写。
		4)语法注意事项
				①如果文件名叫 h ello.c // h e中间有空格
					你就要加引号,写成 SET(SRC_LIST "h ello.c") 
				②文件的后缀可以不写,但是如果有重名不同后缀的会报错。
						eg: ADD_EXECUTABLE(hello 1 2 3.c)  //若文件夹只存在1.c 2.c 就不会报错
														   //若文件夹存在1.cpp 1.c  那就会出错

Linux项目构建语句

  1. 一般CMake项目文件结构说明

    src				#文件夹,存放项目源代码文件
    build			#文件夹,存放编译文件,一般在该文件夹内执行 cmake ..  及 make 命令
    doc				#文件夹,存放项目文档	不需要不创建就行了
    CMakeLists.txt	#文件,	CMake命令集
    README			#文件,	项目基础说明		不需要不创建就行了
    runhello.sh 	#文件,	项目脚本			不需要不创建就行了
    COPYRIGHT		#文件,	项目版权文件		不需要不创建就行了
    
    src 中 CMakeLists.txt文件    #CMake命令集
    
  2. 一般CMake构建静、动态库项目文件结构说明

    build			#文件夹,存放编译文件,一般在该文件夹内执行 cmake ..  及 make 命令
    lib				#文件夹,存放构建动静态的源文件
    CMakeLists.txt	#文件,	CMake命令集
    
    lib中 CMakeLists.txt文件    #CMake命令集
    
  3. 内部构建项目文件结构及CMakeLists.txt语句
    在这里插入图片描述

    PROJECT(HELLO)
    
    SET(SRC_LIST hello.c)		//设置变量
    
    MESSAGE(STATUS "This is BINARY dir" ${HELLO_BINARY_DIR})		//打印信息
    
    MESSAGE(STATUS "This is SOURCE dir" ${HELLO_SOURCE_DIR})
    
    ADD_EXECUTABLE(hello ${SRC_LIST})		//执行
    
  4. 外部构建可安装项目文件结构及CMakeLists.txt语句
    在这里插入图片描述

    外面的CMakeLists.txt内容:
    	PROJECT(HELLO_PROJECT)
    	
    	ADD_SUBDIRECTORY(src bin)
    	
    	INSTALL(FILES COPYRIGHT README DESTINATION testcmake/install/cmake/)		//安装文件
    	
    	INSTALL(PROGRAMS runhello.sh DESTINATION testcmake/install/cmake/bin)		//安装脚本
    	
    	INSTALL(DIRECTORY doc/ DESTINATION testcmake/install/cmake/doc)		//安装文件夹中所有内容
    
    src内部的CMakeLists.txt内容:
    	SET(SRC_LIST hello.c)
    
    	ADD_EXECUTABLE(hello ${SRC_LIST})		//生成
    
  5. 外部构建动、静态库文件结构及CMakeLists.txt语句
    在这里插入图片描述

    外面的CMakeLists.txt内容:
    	PROJECT(HELLO)
    	ADD_SUBDIRECTORY(lib bin)
    
    lib内部的CMakeLists.txt内容:
    	SET(SRC_LIST hello.c)
    	
    	//构建静态库
    	ADD_LIBRARY(hello_static STATIC  ${SRC_LIST})
    	SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME "hello")
    	SET_TARGET_PROPERTIES(hello_static PROPERTIES CLEAN_DIRECT_OUTPUT 1)				//避免不能构建下面同名的动态库
    	
    	//构建动态库
    	ADD_LIBRARY(hello_so SHARED ${SRC_LIST})
    	SET_TARGET_PROPERTIES(hello_so PROPERTIES OUTPUT_NAME "hello")
    	SET_TARGET_PROPERTIES(hello_so PROPERTIES CLEAN_DIRECT_OUTPUT 1)
    	
    	//安装上面构建的静、动态库
    	INSTALL(FILES hello.h DESTINATION /usr/include/hello)
    	INSTALL(TARGETS hello_static hello_so LIBRARY DESTINATION /usr/lib ARCHIVE DESTINATION /usr/lib)
    
  开发工具 最新文章
Postman接口测试之Mock快速入门
ASCII码空格替换查表_最全ASCII码对照表0-2
如何使用 ssh 建立 socks 代理
Typora配合PicGo阿里云图床配置
SoapUI、Jmeter、Postman三种接口测试工具的
github用相对路径显示图片_GitHub 中 readm
Windows编译g2o及其g2o viewer
解决jupyter notebook无法连接/ jupyter连接
Git恢复到之前版本
VScode常用快捷键
上一篇文章      下一篇文章      查看所有文章
加:2022-03-21 21:12:07  更:2022-03-21 21:14:11 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 5:52:19-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码